当前位置: 首页 > 知识库问答 >
问题:

在继续之前等待两个观测值完成?

汪臻
2023-03-14

我有一个加载页面,我想在其中对不相关的信息执行两个网络请求(rxjava)。在这两个请求完成之前,我不想进入下一页,即使其中一个或两个都失败了。

>

  • 使用zip将请求绑定在一起。有没有办法不必被迫使用双函数,也不必返回null?

    请求A和B有一个。doOnNext和。多恩。如果其中一个返回错误,zip observable是否继续?zip订阅服务器是否也会返回错误?

    这是最好的方法吗?

    private Disposable retrieveBothThings() {
    return Observable.zip(getThingA(), getThingB(),
                        (A, B) -> {
                            onAllCallsComplete();
                            return null;
                        })
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(o -> {}, Logger::e);
    }
        
        
    
    private Observable<...> getThingA() {
                return SessionManager.getInstance().getApi()
                        .getA()
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .doOnNext(this::onACompleted)
                        .doOnError(this::onAFailed);
    }
    
    private Observable<...> getThingB() {
            return SessionManager.getInstance().getApi()
                    .getB()
                    .subscribeOn(Schedulers.io())
                  .observeOn(AndroidSchedulers.mainThread()).toObservable()
                    .doOnNext(this::onBSuccess)
                    .doOnError(this::onBFailure);
    }
        
    private void onBSuccess(...) {
        ...        
    }
        
    private void onBFailure(final Throwable throwable) {
        Logger.e(throwable);
    }
    
    private void onACompleted(...) {
        ...        
    }
        
    private void onAFailed(final Throwable throwable) {
        Logger.e(throwable);
    }
    
  • 共有1个答案

    詹弘毅
    2023-03-14

    可以使用merge()操作符组合两个观察值。您可以使用onErrorResumeNext()将错误转换为onComplete()

    Completable.merge(
      observable1
        .doOnNext(this::onACompleted)
        .doOnError(this::onAFailed)
        .onErrorResumeNext( Completable.complete() )
        .toCompletable(),
      observable2
        .doOnNext(this::onBCompleted)
        .doOnError(this::onBFailed)
        .onErrorResumeNext( Completable.complete() ),
        .toCompletable() )
    .subscribe( ignore -> {}, 
                error -> {},
                () -> { processCompletion(); } );
    
     类似资料:
    • 我正试图通过迁移当前使用Angular1/AngularJS编写的应用程序来提高我对Angular2的了解。 有一个特征特别难倒了我。我试图复制一个功能,其中调用函数等待继续,直到它正在调用的函数完成了一个循环的promise。在AngularJS中,我调用的函数基本上是这样的: 它包含一个调用另一个函数()的循环,该函数还返回一个promise,并将所有返回的promise存储在一个数组中。 使

    • 问题内容: 我正在尝试在Node.js / Express中创建一个路由,该路由从两个查询中读取数据,然后基于来自查询的数据来增加计数。由于Node.js是异步的,因此在读取所有数据之前会显示总计。 我创建了一个简单的示例,以达到我目前正在做的事情 我不确定要等到两个功能都完成后才能打印总计,我该做什么。我是否需要创建一个自定义事件发射器来实现这一目标? 问题答案: 拥抱异步性: 或使用Promi

    • 我有两个JS函数。一个叫另一个。在调用函数中,我想调用另一个函数,等待该函数完成,然后继续。例如,伪代码: 我想出了这个解决方案,但不知道这是否是一个明智的方法。 这合法吗?有没有更优雅的处理方法?也许用jQuery?

    • 我有一个方法,可以为WebView的WebEngine设置一个新的网页,需要等到网页加载完成后才能继续使用当前方法。 基本上我想要: 我尝试过使用ChangeListener(),但它只会在我的方法完成执行后执行。我在谷歌上搜索了许多导致更多挫折感的术语,比如“java非阻塞等待布尔值”。最终,我成功地启动了新线程(以防止应用程序GUI锁定)并使用了倒计时(与Thread.join()相反)。下面

    • 我必须使用axios提出请求,以便获取一些数据,这些数据应该作为道具传递给React组件。下面是我的渲染函数: FateChBoardList是一个异步函数,因此它将返回一个promise。我可以将然后和捕获处理程序附加到返回promise,但在这种情况下,我必须在两个处理程序中放入相同的超文本标记语言代码。还有别的办法吗?