node.js,bluebird,执行path控制不佳

我正在努力学习蓝鸟; 我不是想控制执行。 (这个bluebird问题来自Node.js,asynchronous模块,并发性的一个async.js问题。)

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

问题:

  • 为什么#3function在(1)#1和#2function结束之前开始,以及(2)第一个错误检查function?
  • 什么导致了错误?
  • 发生了什么“代码结束”?
var Promise = require('bluebird') function part1() { console.log('part1 start') return new Promise(function(resolve, reject) { 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') } ) .then(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 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 

我有

 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 

问题(重复阅读方便):

  • 为什么#3function在(1)#1和#2function结束之前开始,以及(2)第一个错误检查function?
  • 什么导致了错误?
  • 发生了什么“代码结束”?

提前致谢。

这是因为你对part1a(3)调用没有被包装在一个函数中,所以它被立即调用,而不是等待先前的promise被解决:

 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') })