从一系列承诺中获取值

时间:2017-01-13 16:04:12

标签: javascript rxjs rxjs5

我刚开始学习这些神奇的东西。我无法弄清楚如何从一系列承诺中获取价值。我在哪里:

const one = new Promise(resolve => {
  setTimeout(() => {
    resolve(1);
  }, 1000);
})
const two = new Promise(resolve => {
  setTimeout(() => {
    resolve(2);
  }, 2000);
})
const observable = Rx.Observable.from([one, two]);
observable.subscribe(v => console.log(v));

我进入控制台:

Promise { <pending> }
Promise { <pending> }

我想得到:

  1. 作为值[1,2]
  2. 的数组结果
  3. 以承诺解析顺序1,2
  4. 作为单个值的结果

    所以,基本上我想模仿:

    1. Promise.all([one, two])
    2. Promise.resolve(1), Promise.resolve(2)

1 个答案:

答案 0 :(得分:5)

静态方法Observable.from()会发出数组中的每个项目,因此您现在拥有的只会发出两个Promise个对象:

你正在处理所谓的高阶Observables(又名Observables发射Observables)。这在RxJS 5中可以轻松解决concatAllmergeAll,具体取决于您是否关注它们的指定顺序,或者可以将它们作为解决方案收集。

RxJS 5以相同的方式处理Observables,Promises,迭代器,数组(以及类似于对象的数组)。这意味着我们使用你的Promise就像它们是Observables一样。

我在这里使用mergeAll表示第二个Promise首先完成,即使它们以相反的顺序[one, two]定义。

const one = new Promise(resolve => {
  setTimeout(() => {
    resolve(1);
  }, 1000);
})
const two = new Promise(resolve => {
  setTimeout(() => {
    resolve(2);
  }, 500);
})

// Result as individual values in order of promise resolution 2,1
Rx.Observable.from([one, two])
  .mergeAll()
  .subscribe(v => console.log('mergeAll: ' + v));

// Result as an array of values [2,1]
Rx.Observable.from([one, two])
  .concatAll()
  .toArray()
  .subscribe(v => console.log(v));

查看现场演示:https://jsbin.com/tigidon/4/edit?js,console

打印到控制台:

mergeAll: 2
mergeAll: 1
[2, 1]