我正在使用一个链来控制流量,并且无法在step2()
中获取promise.map以等待所有生成的promise都被解析。
这是我想要实现的流程的视觉效果。
step1()
step2()
step2()
step2()
step2()
step3()
在step2()
我正在使用Bluebird的promise.map。
这是链条:
step1()
.then(function() { return step2() })
.then(function() { return step3() })
.catch(function() { // handle errors })
这是我每个步骤的功能:
let step1 = function() {
return new Promise(function(resolve, reject) {
// do stuff
resolve()
})
}
let step2 = function() {
return new Promise(function(resolve, reject) {
things = []
return Promise.map(things, function(thing) {
// load file async with callback
})
resolve()
})
}
let step3 = function() {
return new Promise(function(resolve, reject) {
// do stuff
resolve()
})
}
我已经使用timeout
测试了包含更多步骤的链,除了step2()
中的promise.map之外,它按预期工作。我究竟做错了什么? :)
答案 0 :(得分:3)
问题来自第2步。Promise.map
已经返回promise,所以你可以将它返回给被调用者。然后使用new Promise
回调来扭曲异步函数。
let step2 = function() {
things = []
return Promise.map(things, function(thing) {
// load file async with callback
return new Promise(function(resolve, reject) {
fileAsyncFunc(thing, function callback(err, data) {
if(err) {
reject(err);
return;
}
resolve(data);
});
});
});
}
答案 1 :(得分:0)
您没有正确调用let step2 = function() {
things = []
return Promise.map(things, function(thing) {
return new Promise( function( resolve, reject ) {
// load file async with callback
resolve(...)
} )
})
}
回调。
resolve()
在你的情况下,总是调用jq -r '.[] | select(.hosts | contains('$array')).hostName')
,因为你正在执行异步函数来加载文件。