javascript - promise串行封装
本文介绍了javascript - promise串行封装的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
想要一个Promise.queue,类似Promise.all,接受一个装了很多个promise对象的数组,但逐个依次决议(不像all一样是并发的,这里想要的是串行一个接一个的完成决议),获得一个结果数组,不考虑参数传递,google了一些答案,感觉都不太满意,求教大家,谢谢
解决方案
明白你的意思了,你要这么实现的话不能传入 Promise,因为在你创建 Promise 的一刻它就开始 pending 等待 settlement 了。
你应该传入一系列的 executors ,等上一个 Promise resolved 之后再创建新的 Promise。
数组可以放入函数,会自动 new Promise 并执行函数,其它类型则直接 resolve 掉。如果有 reject 返回第一个。
function promiseQueue (executors) {
return new Promise((resolve, reject) => {
if (!Array.isArray(executors)) { executors = Array.from(executors) }
if (executors.length <= 0) { return resolve([]) }
var res = []
executors = executors.map((x, i) => () => {
var p = typeof x === 'function' ? new Promise(x) : Promise.resolve(x)
p.then(response => {
res[i] = response
if (i === executors.length - 1) {
resolve(res)
} else {
executors[i + 1]()
}
}, reject)
})
executors[0]()
})
}
下面例子可以看到,前面异步的时间更长,但依然按顺序执行
function alarm (msg, time) {
return resolve => {
setTimeout(() => {
console.log(msg)
resolve(msg)
}, time)
}
}
promiseQueue([alarm('1', 4000), alarm('2', 1000), 12, 'hellp', alarm('3', 3000)]).then(x => console.log(x))
promiseQueue([() => Promise.reject('error1'), 12, 'hellp', () => Promise.reject('error2')]).then(null, e => console.log(e))
这篇关于javascript - promise串行封装的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文