有以下若干promise,实现方法使得promises串行执行返回结果。
const promise1 = () => new Promise((resolve, reject) => {
setTimeout(() => {
resolve(5)
}, 2000)})
const promise2 = () => new Promise((resolve, reject) => {
setTimeout(() => {
resolve(1)
}, 3000)
})const promise3 = () => new Promise((resolve, reject) => {
setTimeout(() => {
resolve(7)
}, 1000)
})
var arr = [promise1, promise2, promise3];
方法一 async/await执行
var fn = async function (arr) {
for (let i = 0, len = arr.length; i < len; i++) {
var result = await arr[i]()
console.log(result)
}
}
fn(arr)
方法二 then方法循环连接
const startTime = new Date().getTime();
const promiseThen = function (arr) {
let res = Promise.resolve()
arr.forEach(item => {
res = res.then(() => {
return item()
}).then((data) => {
console.log(data)
})
});
res.then(() => console.log(new Date().getTime() - startTime))
}
promiseThen(arr)
方法三 rxjs操作符实现
const { concatMap, reduce, catchError } = require("rxjs/operators");
const { of } = require('rxjs');
//...promise数组声明
const startTime = new Date().getTime();
of(...arr)
.pipe(
concatMap(test => test().catch(err => err)),
reduce((acc, cur) => [...acc, cur], []))
.subscribe(val => {
console.log(val)
console.log(new Date().getTime() - startTime)
});