2个promise怎么串行执行? - CNode技术社区

2个promise怎么串行执行?
发布于 8 年前 作者 muzi-xiangxiang 9282 次浏览 来自 问答

有getA(),getB()两个promise,当A执行完成执行B,并获得B的执行结果进行提示, image.png

12 回复
getA().then(result=>getB(result)).then(result =>{
 // some tips
 })

async/await

@Sunshine168 预期的输出是这样的 新增列表:462//异步操作完成输出>新增状态 更新列表:0 删除列表:0 新增状态:true 123 image.png 实际输出: 新增列表:462//异步操作完成输出>新增状态 更新列表:0 删除列表:0 123 新增状态:true 先打印了123,而没有等待第一个方法的异步执行完成

建议 async/await

async/await,否则

a()
 .then(data => {
 return b(data)
 })
 .then(res => {
 //todo blabla...
 })

楼上说的对, 结果传递的确是Promise的一个痛点, async/await可以让代码好看些。

@muzi-xiangxiang 这样的话应该就是你第一个promise里面有问题了 你试试 async/await写法验证看看

谢谢各位

方法: 支持回调,回调可以是纯函数,也可以是返回Promise的函数

/**
 * 顺序执行Promise,并返回结果
 * @param {返回promise的函数集合} promises 
 * @param {每一步的回调函数,非异步,可以考虑后期支持} cb 
 * @param {附加参数} args 
 */
function sequence(promises, cb, ...args) {
 const p = Promise.resolve(),
 len = promises.length
 if (len <= 0) {
 return p
 }
 let i = 0,
 cbr,
 isPromiseCallBack
 //如果cb不是函数
 if (!isFunction(cb)) {
 cb = null
 args = [cb, ...args]
 }
 function next(...params) {
 return p.then(r => {
 return promises[i](r, ...params)
 }).then(r => {
 ++i
 return isFunction(cb) && (isPromiseCallBack = isPromise(cbr = cb(r, i, ...params))) ? cbr : r
 }).then(r => {
 return i > len - 1 ? Promise.resolve(r) : next(...params)
 })
 }
 return next(...args)
}

测试:

const p1 = function () {
 return new Promise((resolve, reject) => {
 setTimeout(function () {
 resolve(1)
 }, 1000)
 })
 },
 p2 = function () {
 return new Promise((resolve, reject) => {
 setTimeout(function () {
 resolve(2)
 }, 2000)
 })
 },
 p3 = function () {
 return new Promise((resolve, reject) => {
 setTimeout(function () {
 resolve(3)
 }, 3000)
 })
 }
function printTime() {
 console.log(new Date().toLocaleString(), ...arguments)
}
const promises = [p1, p2, p3]
sequence(promises, function (r, i, ...args) {
 //return new Promise((resolve, reject) => {
 console.log('Time:', new Date().toLocaleString())
 console.log('result:' + r, 'index:' + i, 'args:' + args)
 console.log('')
 // resolve('haha')
 //})
}, {
 a: 1,
 b: 2
}, 3).then(r => printTime('result:', r))
await getA()
await getB()
回到顶部

AltStyle によって変換されたページ (->オリジナル) /