有getA(),getB()两个promise,当A执行完成执行B,并获得B的执行结果进行提示,
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,否则
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
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
async/await
@Sunshine168 预期的输出是这样的 新增列表:462//异步操作完成输出>新增状态 更新列表:0 删除列表:0 新增状态:true 123
实际输出:
新增列表:462//异步操作完成输出>新增状态
更新列表:0
删除列表:0
123
新增状态:true
先打印了123,而没有等待第一个方法的异步执行完成
建议 async/await
async/await
async/await,否则楼上说的对, 结果传递的确是Promise的一个痛点, async/await可以让代码好看些。
@muzi-xiangxiang 这样的话应该就是你第一个promise里面有问题了 你试试 async/await写法验证看看
谢谢各位
方法: 支持回调,回调可以是纯函数,也可以是返回Promise的函数
测试:
gggggggg