2个promise怎么串行执行?
有getA(),getB()两个promise,当A执行完成执行B,并获得B的执行结果进行提示,
12 回复
getA().then(result=>getB(result)).then(result =>{
// some tips
})
async/await
@Sunshine168 预期的输出是这样的 新增列表:462//异步操作完成输出>新增状态 更新列表:0 删除列表:0 新增状态:true 123 实际输出: 新增列表:462//异步操作完成输出>新增状态 更新列表:0 删除列表:0 123 新增状态:true 先打印了123,而没有等待第一个方法的异步执行完成
建议 async/await
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()
gggggggg