我正在使用Obtrables的Retrofit,并希望链接可观察量.通常它适用于map()或flatMap()等函数,因为api返回执行任务的Observable.但在这种情况下,我必须做以下事情:
>来自api的getKey()
>在另一个库Foo中使用返回的键,并等待调用回调.
>当回调返回时,将结果发送到api.
我希望这是一个单一的链接调用,所以我只需要订阅一次.我猜我可以使用merge()或join()或其他东西,但不确定处理回调的最佳方法是什么.
有没有办法让这更好?这是我到目前为止:
api.getKey().subscribe(new Action1<String>() { @Override public void call(String key) { Foo foo = new Foo(); foo.setAwesomeCallback(new AwesomeCallback() { @Override public void onAwesomeReady(String awesome) { api.sendAwesome(awesome) .subscribe(new Action1<Void>() { @Override public void call(Void aVoid) { handleAwesomeSent(); } }); } }); foo.makeAwesome(); } });
解决方法
调整clemp6r的解决方案,这是另一个既不需要主题也不需要嵌套订阅的解决方案:
api.getKey().flatMap(new Func1<String,Observable<String>>() { @Override public Observable<String> call(String key) { return Observable.create(new Observable.OnSubscribe<String>(){ @Override public void call(final Subscriber<? super String> subscriber) { Foo foo = new Foo(); foo.setAwesomeCallback(new AwesomeCallback() { @Override public void onAwesomeReady(String awesome) { if (! subscriber.isUnsubscribed()) { subscriber.onNext(awesome); subscriber.onComplete(); } } }); foo.makeAwesome(); } }); }).flatMap(new Func1<String,Observable<String>>() { @Override public Observable<String> call(String awesome) { return sendAwesome(awesome); } }).subscribe(new Action1<Void>() { @Override public void call(Void aVoid) { handleAwesomeSent(); } });
一般来说,我认为总是可以使用Observable.create()在Observable中包装任何基于回调的异步操作.