2

是否有一个 Promise.all 的等价物?

let prom1 = doA(); // some promise
let prom2 = doB(); // another promise

// wait for both promises to complete.
Promise.all([prom1, prom2], values => {
    // do something;
}); 

无法从文档中将其拼凑在一起,各种文章都建议使用 ForkJoin,但无法使其正常工作...

let behaviour1 = new BehaviourSubject(0);
let behaviour2 = new BehaviourSubject(1);
let allObserver = new ForkJoinObservable(behaviour1, behaviour2);

behaviour1.subscribe( () => console.log('i work'));
behaviour2.subscribe( () => console.log('i work'));
allObserver.subscribe( () => console.log('i dont work'));

可能只是切换回诺言的理智世界。

4

3 回答 3

3

Rx.Observable具有toArray可用于复制Promise.all行为的功能:它存储流的所有发出值并等待底层流的 onComplete 事件触发。一旦所有底层项目都已发出,结果流将发出单个项目:

// Instead of Promises, we can model our async actions as observables
const operation1$ = Rx.Observable.just(1);
const operation2$ = Rx.Observable.just(2);

// Merge all our async results into a single stream
const result$ = Rx.Observable.merge(operation1$, operation2$)

// Finally, call toArray to combine all results
result$
    .toArray()
    .subscribe(x => console.log(x));
// >> [1, 2]
于 2016-03-07T15:55:53.843 回答
0
import Rx, { Observable } from 'rxjs' 
import axios from 'axios'

const promiseA = axios.get('https://jsonplaceholder.typicode.com/users/1')
    , promiseB = axios.get('https://jsonplaceholder.typicode.com/users/2')

const promiseStream$ = Observable   
       .of(promiseA, promiseB)       // promises go here
       .flatMap(promise=>promise)    // resolve the promise under the hood         
       .map(response=>response.data)   
       .map(user=>user.name)   
       .subscribe(
           name=>console.log(`name is ${name}`)
           // name is Ervin Howell
           // name is Leanne Graham   
       )

flatMap(promise=>promise) flapMap 将帮助您解决底层的承诺

于 2017-01-10T09:42:33.053 回答
0

一种有点俗气的做法是使用toPromise

Promise.all([behaviour1.toPromise(), behaviour2.toPromise()])

toPromise将返回一个在底层可观察对象完成时解决的承诺。

但是,由于大多数可观察对象在完成之前发出超过 1 个值,因此像 和 之类的操作zip可能combineLatestwithLatestFrom接近您正在寻找的内容:

压缩

行为 1 的每个值都被压缩为行为 2 的值。如果任一输入的值用完,它就会停止,直到该输入再次具有值。

Observable.zip(behavior1, behavior2)
  .subscribe(([b1, b2]) => console.log(b1, b2))

另请参阅:文档交互式大理石图

结合最新

与 zip 类似,但每次 behavior1 或 behavior2 发出一个值时都会发出一个值,并将重用另一个 observable 的最新值进行配对。

Observable.combineLatest(behavior1, behavior2)
  .subscribe(([b1, b2]) => console.log(b1, b2))

另请参阅:文档交互式大理石图

与最新从

与 combineLatest 类似,但只有一个 observable 决定何时发出值。

behavior1.withLatestFrom(behavior2)
  .subscribe(([b1, b2]) => console.log(b1, b2))

另请参阅:文档交互式大理石图

于 2017-11-03T15:41:31.093 回答