Javascript 如何在承诺链中返回promise.map(蓝鸟)?
我正在使用一个链来控制流,无法在Javascript 如何在承诺链中返回promise.map(蓝鸟)?,javascript,node.js,asynchronous,promise,bluebird,Javascript,Node.js,Asynchronous,Promise,Bluebird,我正在使用一个链来控制流,无法在step2()中获取promise.map以等待它生成的所有承诺得到解决 这是我试图实现的流程的视觉效果 step1() 步骤2() 步骤2() 步骤2() 步骤2() 步骤3() 在step2()中,我使用的是蓝鸟的promise.map 这是链条: step1() .then(函数(){return step2()}) .then(函数(){return step3()}) .catch(函数(){//handle errors}) 以下是我每个步骤的功能:
step2()
中获取promise.map以等待它生成的所有承诺得到解决
这是我试图实现的流程的视觉效果
step1()
步骤2()
步骤2()
步骤2()
步骤2()
步骤3()
在step2()
中,我使用的是蓝鸟的promise.map
这是链条:
step1()
.then(函数(){return step2()})
.then(函数(){return step3()})
.catch(函数(){//handle errors})
以下是我每个步骤的功能:
let step1=函数(){
返回新承诺(函数(解析、拒绝){
//做事
解决()
})
}
设step2=函数(){
返回新承诺(功能(解决、拒绝){
事物=[]
return Promise.map(事物、函数(事物){
//使用回调异步加载文件
})
解决()
})
}
设step3=函数(){
返回新承诺(函数(解析、拒绝){
//做事
解决()
})
}
我已经用更多的步骤测试了这个链,每个步骤都有一个
超时
,除了step2()。我做错了什么?:) 您没有正确调用resolve
回调函数
let step2 = function() {
things = []
return Promise.map(things, function(thing) {
return new Promise( function( resolve, reject ) {
// load file async with callback
resolve(...)
} )
})
}
在您的情况下,始终调用resolve()
,因为您正在执行加载文件的异步函数。问题来自步骤2Promise.map
已经返回Promise,所以您可以将其返回给被调用方。然后使用回调函数扭曲异步函数,并使用newpromise
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
中,无法调用resolve()
return
有效地停止了代码的执行,因此之后的任何代码都不会被执行。它可以正常工作!但出于好奇,如果您使用超时来伪造异步调用,它将不起作用。。。为什么会这样?我真的不明白你的问题,你怎么用超时来伪装异步调用?这可能只是因为异步调用在超时之前完成,所以您可以从异步调用中获得结果,但这不是一个好主意,因为您永远不知道哪一个先完成。是的,没关系,我认为仅使用超时就可以近似于执行实际的异步调用。我懒散的测试方式。无论如何,通过一个实际的异步调用来加载一个文件,它工作得非常好,谢谢你的帮助。