node.js, bluebird, mal control de la ruta de ejecución

Estoy tratando de aprender bluebird; No estoy controlando la ejecución como quiero. (Esta pregunta de bluebird provino de una pregunta async.js en Node.js, módulo async, concurrencia ).

Aquí hay algo de código, más lo que esperaba obtener y lo que obtuve en su lugar.

Preguntas:

  • ¿Por qué la función # 3 comienza antes de (1) el final de las funciones # 1 y # 2 y (2) la primera función de verificación de errores?
  • ¿Qué causó el error?
  • ¿Qué pasó con “fin de código”?
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') } ) 

Esperaba

 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 

tengo

 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 

Preguntas (repetidas para conveniencia del lector):

  • ¿Por qué la función # 3 comienza antes de (1) el final de las funciones # 1 y # 2, y (2) la primera función de verificación de errores?
  • ¿Qué causó el error?
  • ¿Qué pasó con “fin de código”?

Gracias por adelantado.

Es porque su llamada a part1a(3) no está envuelta en una función, por lo que se la llama de inmediato en lugar de esperar a que se resuelvan las promesas anteriores:

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