Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在承诺链中返回promise.map(蓝鸟)?_Javascript_Node.js_Asynchronous_Promise_Bluebird - Fatal编程技术网

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()
,因为您正在执行加载文件的异步函数。

问题来自步骤2
Promise.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
有效地停止了代码的执行,因此之后的任何代码都不会被执行。它可以正常工作!但出于好奇,如果您使用超时来伪造异步调用,它将不起作用。。。为什么会这样?我真的不明白你的问题,你怎么用超时来伪装异步调用?这可能只是因为异步调用在超时之前完成,所以您可以从异步调用中获得结果,但这不是一个好主意,因为您永远不知道哪一个先完成。是的,没关系,我认为仅使用超时就可以近似于执行实际的异步调用。我懒散的测试方式。无论如何,通过一个实际的异步调用来加载一个文件,它工作得非常好,谢谢你的帮助。