Angular2.如何检查观察是否完成?

csm*_*m86 17 rxjs angular2-observables angular

在我的页面中有一个生成报告的按钮.该报告需要在加载页面时使用http调用加载到休息端点的数据,但我无法保证在用户按下报告按钮时加载它们.

如何观察观察结果是否完整,如果不完整,等待动作直到http呼叫完成?以下是一些代码:

loadCompanies(): void {
    this._companyService.getCompanies().subscribe(
        response => {
            this.companiesModel = response;
        },
        err => console.log(err)
    );
}
Run Code Online (Sandbox Code Playgroud)
generateReport() {
   // check if observable that loads companies is completed and do the 
   // action using companiesModel.
} 
Run Code Online (Sandbox Code Playgroud)

一个选项是在加载公司中设置标志,其值为"loading"和"completed",并等待generateReport()标志完成,但我希望Observable尽可能使用API 的解决方案.

ulu*_*eyn 14

您可以通过使用onCompleted回调来完成此操作subscription.例如,假设您在用户按下报告按钮时显示加载栏;

loadCompanies(): void {
     this._companyService.getCompanies().subscribe(
          response => {
               this.companiesModel = response;
          },
          err => {
               console.log(err);
               //closeLoadingBar();
          },
          () => {
               //do whatever you want
               //closeLoadingBar()
          }
     )
}

generateReport() {
    //showLoadingBar()
    this.loadCompanies();
}
Run Code Online (Sandbox Code Playgroud)

如果从http调用中收到错误,onCompleted则不会调用方法,只会onError调用该方法.如果成功,onCompleted将在您的onNext方法之后调用方法.

这是订阅的文档.我希望它有所帮助!


Val*_*ich 7

另一种解决方案:

实际上 subscribe 函数需要三个参数:

onNext onError onCompleted

this._companyService.getCompanies().subscribe(
    (response) => { this.companiesModel = response; },
    (err) => { console.log(err) },
    (finally) => { console.log('finally') }
);
Run Code Online (Sandbox Code Playgroud)

  • 相同的。我是否被迫在该回调中设置一个标志?这感觉比它应该的更难。没有 observable.isComplete 属性吗? (3认同)
  • 谢谢您的回复。我知道这件事。但我的情况不同。当 observable 完成时,我不需要触发我的动作。当我的动作完成时,我需要检查 observable 是否完成,如果没有,等待完成。 (2认同)