【问题标题】:Wait for observable to complete等待可观察完成
【发布时间】:2018-01-03 10:16:42
【问题描述】:

我有一系列方法依赖于其他方法的完成。

process1(data: string) : Observable<string> {
   this.dataservice.process(data).subscribe(
            (response) => {
                return response.data;
            }
        );
}

main(data: string) : string {

   var process1Data: string = process1(data); 

   // I would like to wait for process1 method to complete before running process2
   // I do not want to include process2 inside subscribe of process1 because I have to make few more method calls
   var process2Data: string = process2(process1Data);

   var process3Data: string = process3(process2Data);

   ...

}

如何在调用下一个方法(process2,process3)之前等待可观察对象完成? (类似于 c# 中的 await)

【问题讨论】:

    标签: javascript angular typescript rxjs observable


    【解决方案1】:

    你可以使用 es6 async/await

    async main(data: string): string {
        var process1Data: string = await process1(data).toPromise();
        var process2Data: string = process2(process1Data);
        ...
    }
    

    【讨论】:

    • 是的,它会以这种方式工作,但是我也必须使所有 main 的调用方法也异步。是否可以在不使主要异步的情况下实现这一点?如果需要,我可以使 process1 异步。
    • @Andre 不准确,Observables 可以与 Promises 互操作 - 请参阅 RxJS Observable interop with Promises and Async-Await
    【解决方案2】:

    您可以使用 rxjs 连接运算符。 请参阅此处的文档。 concat

    基本上它会等到第一个或源 observable 返回,然后再执行下一个。

    更新

    您也可以根据自己的需求尝试switch或switchmap等操作符。

    【讨论】:

      【解决方案3】:

      你可以试试这样的...

      main(data: string) : string {
      
          process1Data$: Observable<string> = process1(data)
              .take(1)
              .switchMap((process1Data) => return process2(process1Data);
          .
          .
          .
      }
      

      显然,take(1) 假定 process1(...) 解析为单个值并停止。之后,它从switchMaps 到process2,这意味着它开始发射process2 给出的任何可观察到的东西。 另一方面,如果您希望对process1 发出的每个结果运行process2,那么只需删除take(1)

      【讨论】:

        【解决方案4】:

        原始问题中的process1 令人困惑,因为它没有返回Observable&lt;string&gt;(也许我正在使用来自“rxjs/Observable”的另一个Observable)。

        这是我指的代码(在原始问题中):

        process1(data: string) : Observable<string> {
           this.dataservice.process(data).subscribe(
                    (response) => {
                        return response.data;
                    }
                );
        }
        

        对我来说,我把它改成了这样:

        process1(data: string) : Observable<string> {
           return this.dataservice.process(data).map(  //subscribe-->map
                    (response) => {
                        return response.data;
                    }
                );
        }
        

        然后要在process1 完成后发生某些事情,只需使用subscribe,就像使用其他任何Observable 一样:

        main(data: string) : string {
           process1(data).subscribe((process1RetVal)=>
           {
                 process2(process1RetVal);
           });
        }
        

        【讨论】:

          猜你喜欢
          • 2019-03-25
          • 2017-09-08
          • 2017-10-12
          • 2019-08-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多