【问题标题】:Get values from an array of promises从一组承诺中获取值
【发布时间】:2017-05-29 01:41:19
【问题描述】:

我刚刚开始学习这些神奇的东西。我不知道如何从一系列承诺中获取值。这是我的位置:

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. 结果为单个值,按承诺解决的顺序1,2

所以,基本上我想效仿:

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

【问题讨论】:

标签: javascript rxjs rxjs5


【解决方案1】:

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

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

RxJS 5 以同样的方式对待 Observables、Promises、迭代器、数组(和类似数组的对象)。这意味着我们像使用 Observable 一样使用您的 Promise。

我在这里使用 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]

【讨论】:

  • 先生,你太棒了!我爱你!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-20
  • 2019-04-26
  • 2018-05-16
  • 2018-06-04
  • 2018-12-24
  • 1970-01-01
相关资源
最近更新 更多