如何在承诺链中 return promise.map (bluebird)?
How to return promise.map (bluebird) inside a promise chain?
我正在使用链来控制流程,无法在 step2()
中获取 promise.map 以等待其所有生成的承诺都得到解决。
这是我试图实现的流程的视觉效果。
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 除外。我究竟做错了什么? :)
您没有正确调用 resolve
回调。
let step2 = function() {
things = []
return Promise.map(things, function(thing) {
return new Promise( function( resolve, reject ) {
// load file async with callback
resolve(...)
} )
})
}
在你的情况下,总是调用 resolve()
,因为你正在执行加载文件的异步函数。
问题来自第 2 步。Promise.map
已经 return 承诺,因此您可以 return 将其发送给被叫方。然后你用 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);
});
});
});
}
我正在使用链来控制流程,无法在 step2()
中获取 promise.map 以等待其所有生成的承诺都得到解决。
这是我试图实现的流程的视觉效果。
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 除外。我究竟做错了什么? :)
您没有正确调用 resolve
回调。
let step2 = function() {
things = []
return Promise.map(things, function(thing) {
return new Promise( function( resolve, reject ) {
// load file async with callback
resolve(...)
} )
})
}
在你的情况下,总是调用 resolve()
,因为你正在执行加载文件的异步函数。
问题来自第 2 步。Promise.map
已经 return 承诺,因此您可以 return 将其发送给被叫方。然后你用 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);
});
});
});
}