node.js,bluebird,执行路径控制不好
node.js, bluebird, poor control of execution path
我正在努力学习蓝鸟;我没有像我想的那样控制执行。 (这个蓝鸟问题来自 的 async.js 问题。)
这是一些代码,加上我期望得到的和我得到的。
问题:
- 为什么 #3 函数在 (1) #1 和 #2 函数结束以及 (2) 第一个错误检查函数之前开始?
- 错误原因是什么?
- "end of code" 怎么了?
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
问题(为了 reader 方便而重复):
- 为什么 #3 函数在 (1) #1 和 #2 函数结束以及 (2) 第一个错误检查函数之前开始?
- 错误原因是什么?
- "end of code" 怎么了?
提前致谢。
这是因为您对 part1a(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')
})
我正在努力学习蓝鸟;我没有像我想的那样控制执行。 (这个蓝鸟问题来自
这是一些代码,加上我期望得到的和我得到的。
问题:
- 为什么 #3 函数在 (1) #1 和 #2 函数结束以及 (2) 第一个错误检查函数之前开始?
- 错误原因是什么?
- "end of code" 怎么了?
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
问题(为了 reader 方便而重复):
- 为什么 #3 函数在 (1) #1 和 #2 函数结束以及 (2) 第一个错误检查函数之前开始?
- 错误原因是什么?
- "end of code" 怎么了?
提前致谢。
这是因为您对 part1a(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')
})