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

有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()
回到顶部