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