我刚刚开始学习这些神奇的东西。我不知道如何从一系列 promise 中获取值(value)。这是我的位置:
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,2]
- 按照 promise 解析顺序作为单个值的结果
1,2
所以,基本上我想效仿:
Promise.all([one, two])
Promise.resolve(1), Promise.resolve(2)
最佳答案
静态方法 Observable.from()
发出数组中的每个项目,因此您现在拥有的只会发出两个 Promise
对象:
您正在处理所谓的高阶 Observables(又名 Observables emitting Observables)。这在 RxJS 5 中可以通过 concatAll
或 mergeAll
轻松解决,具体取决于您是关心它们指定的顺序还是它们可以作为解析收集。
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]
关于javascript - 从一系列 promise 中获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41638759/