假设一个场景,我们需要从服务端请求API1得到一组关于学生成绩的数据,然后根据返回的数据进行判断如果返回成绩为60,则请求API2,并将成绩100,不为60时,成绩10最终返回经过API1和API2两次处理的结果。
问题重现
如果我们整个流程通过Obvervable
来模拟,可以实现下面的代码
1 | reproduce(): Observable<Student[]> { |
这里执行完成后,我们会发现,返回的结果为50,60,70
,而我们正常期望的结果应该是5000,600,700
,这个问题的关键在于of
直接返回了结果result
,导致没有等待map
完成输出正确的结果。
通过创建Obvervable分布返回计算结果
关于上面的问题,一种解决方案就是创建Obvervable
对象并分布返回计算后的结果,示例代码如下:
1 | createObvervableSolution(): Observable<Student[]> { |
通过上面的方式,我们会得到500,700,6000
, 顺序不一致主要是因为在60的时候,我们需要等待Http请求完成,会花费时间。
通过Async Await实现
关于将Observable
转化为Promise
,我们可以通过toPromise
实现
1 | async async_await_SolutionTest() { |
在线测试
引用
- Angular 6 waiting for Observable
- Convert Asynchronous Calls To Synchronous In JavaScript
- How to make one Observable sequence wait for another to complete before emitting?