仅在接收到第二个 Observable 后才发出 Observable
Emit Observable only after second Observable is received
我正在使用 Rx 通过 Retrofit 调用我们的 API。在某些时候我需要调用我们的 API,等待响应 1,从中提取一些元数据,然后再次调用 API 等待响应 2。在我有响应 2 之后,我可以发出我的 Observable。我的问题是,我不知道如何:
拨打电话 2 并仅在我收到响应 2
后才发出
这是我的 class 函数,它们应该发出 Model Observable。方法 get2 不必对外界可见。
public Observable<Model> get1(String slug) {
return api1
.getInfo(slug)
.subscribeOn(Schedulers.io())
.map(resonse1 -> {
String metadata = response1.getMetadata();
//Make call2 with metadata
//call(2)
Model model = response1.getModel();
model.setInfo(/*Info from call2*/)
return model;
})
.observeOn(AndroidSchedulers.mainThread());
}
private Observable<Info> get2(String metadata) {
return api2.getInfo(new InfoAsset(metadata))
.subscribeOn(Schedulers.io())
.map(response2 -> {
return response2.getInfo;
})
.observeOn(AndroidSchedulers.mainThread());
}
而不是 map
使用 flatMap
:
.flatMap(response1 -> {
String metadata = response1.getMetadata();
return get2(metadata)
.map(info -> {
Model model = response1.getModel();
model.setInfo(info);
return model;
});
})
...
不过要小心,因为您正在跨线程使用可变对象,所以您可能会遇到可见性问题。考虑使用不可变对象或确保同步更改。
使用嵌套的 flatMap,不要使用 observeOn,除非你想跳线程:
private Observable<Info> get2(String metadata) {
return api2.getInfo(new InfoAsset(metadata))
.subscribeOn(Schedulers.io())
.map(response2 -> {
return response2.getInfo;
});
// no ObserveOn here.
}
public Observable<Model> get1(String slug) {
return api1
.getInfo(slug)
.subscribeOn(Schedulers.io())
.flatMap (response1 -> {
Model model = response1.getModel();
return get2(response1.getMetadata())
.map(response2 -> {
model.setInfo(response2);
return model;
});
);
});
}
我正在使用 Rx 通过 Retrofit 调用我们的 API。在某些时候我需要调用我们的 API,等待响应 1,从中提取一些元数据,然后再次调用 API 等待响应 2。在我有响应 2 之后,我可以发出我的 Observable。我的问题是,我不知道如何: 拨打电话 2 并仅在我收到响应 2
后才发出这是我的 class 函数,它们应该发出 Model Observable。方法 get2 不必对外界可见。
public Observable<Model> get1(String slug) {
return api1
.getInfo(slug)
.subscribeOn(Schedulers.io())
.map(resonse1 -> {
String metadata = response1.getMetadata();
//Make call2 with metadata
//call(2)
Model model = response1.getModel();
model.setInfo(/*Info from call2*/)
return model;
})
.observeOn(AndroidSchedulers.mainThread());
}
private Observable<Info> get2(String metadata) {
return api2.getInfo(new InfoAsset(metadata))
.subscribeOn(Schedulers.io())
.map(response2 -> {
return response2.getInfo;
})
.observeOn(AndroidSchedulers.mainThread());
}
而不是 map
使用 flatMap
:
.flatMap(response1 -> {
String metadata = response1.getMetadata();
return get2(metadata)
.map(info -> {
Model model = response1.getModel();
model.setInfo(info);
return model;
});
})
...
不过要小心,因为您正在跨线程使用可变对象,所以您可能会遇到可见性问题。考虑使用不可变对象或确保同步更改。
使用嵌套的 flatMap,不要使用 observeOn,除非你想跳线程:
private Observable<Info> get2(String metadata) {
return api2.getInfo(new InfoAsset(metadata))
.subscribeOn(Schedulers.io())
.map(response2 -> {
return response2.getInfo;
});
// no ObserveOn here.
}
public Observable<Model> get1(String slug) {
return api1
.getInfo(slug)
.subscribeOn(Schedulers.io())
.flatMap (response1 -> {
Model model = response1.getModel();
return get2(response1.getMetadata())
.map(response2 -> {
model.setInfo(response2);
return model;
});
);
});
}