Javascript node.js,bluebird,执行路径控制不佳

Javascript node.js,bluebird,执行路径控制不佳,javascript,node.js,asynchronous,bluebird,Javascript,Node.js,Asynchronous,Bluebird,我正在努力学习蓝鸟;我并没有像我想的那样控制执行。(这个蓝鸟问题来自于上的async.js问题。) 这里有一些代码,加上我期望得到的和我得到的 问题: 为什么#3函数在#1和#2函数的结束以及(2)第一个错误检查函数之前启动 是什么导致了这个错误 “代码结束”怎么了 我预料 part1 start part1a start #1 part1a start #2 part1a done #1 // these two could part1a done #2 // reverse pa

我正在努力学习蓝鸟;我并没有像我想的那样控制执行。(这个蓝鸟问题来自于上的async.js问题。)

这里有一些代码,加上我期望得到的和我得到的

问题:

  • 为什么#3函数在#1和#2函数的结束以及(2)第一个错误检查函数之前启动
  • 是什么导致了这个错误
  • “代码结束”怎么了
我预料

part1 start
part1a start #1
part1a start #2
part1a done  #1  // these two could
part1a done  #2  // reverse
part1 done with #1 and #2
part1a start #3
part1a done  #3
part1 done
end of code
我得到

问题(为方便读者重复):

  • 为什么#3函数在#1和#2函数的结束以及(2)第一个错误检查函数之前启动
  • 是什么导致了这个错误
  • “代码结束”怎么了

提前感谢。

这是因为您对
第1a(3)
部分的调用没有包含在函数中,因此会立即调用它,而不是等待前面的承诺得到解决:

function part1() {
    console.log('part1 start')
    // then() returns a promise so no need to create a new Promise
    return Promise.all([part1a(1), part1a(2)])
        .then(function (err) {
            if (err) console.log('part1 error after #1 and #2')
            else console.log('part1 done with #1 and #2')
        })
        // the issue was here, part1a() is a promise
        .then(function () {
            return part1a(3)
        })
        .then(function (err) {
            if (err) console.log('part1 error after #3')
            else console.log('part1 done')
        })
}

function part1a(i) {
    console.log('part1a start #' + i)
    return new Promise(function (resolve, reject) {
        setTimeout(function () {
            console.log('part1a done  #' + i)
            return resolve()
        }, 100)
    })
}

part1().then(function (err) {
    if (err) console.log('outermost code reported error' + err.message)
    else console.log('end of code')
})
part1 start
part1a start #1
part1a start #2
part1a start #3
part1a done  #1
part1a done  #2
part1a done  #3
part1 error after #1 and #2
part1 done
function part1() {
    console.log('part1 start')
    // then() returns a promise so no need to create a new Promise
    return Promise.all([part1a(1), part1a(2)])
        .then(function (err) {
            if (err) console.log('part1 error after #1 and #2')
            else console.log('part1 done with #1 and #2')
        })
        // the issue was here, part1a() is a promise
        .then(function () {
            return part1a(3)
        })
        .then(function (err) {
            if (err) console.log('part1 error after #3')
            else console.log('part1 done')
        })
}

function part1a(i) {
    console.log('part1a start #' + i)
    return new Promise(function (resolve, reject) {
        setTimeout(function () {
            console.log('part1a done  #' + i)
            return resolve()
        }, 100)
    })
}

part1().then(function (err) {
    if (err) console.log('outermost code reported error' + err.message)
    else console.log('end of code')
})