2016-11-24 83 views
0

我正在使用一个链来控制流量,并且无法获得step2()中的promise.map,直到它的所有生成的promise都被解析。如何在promise链中返回promise.map(bluebird)?

下面是我试图实现的流程的视觉效果。

step1() step2() step2() step2() step2() step3()

step2()我使用蓝鸟的promise.map。

这里的链条:

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和它的工作与预期:

step1() 
    .then(function() { return step2() }) 
    .then(function() { return step3() }) 
    .catch(function() { // handle errors }) 

这里是我的每一步功能step2()中的promise.map除外。我究竟做错了什么? :)

+0

在'step2'中调用'resolve()'是无法访问的。 'return'有效地停止了你的代码的执行,所以它后面的任何代码都不会被执行。 – Dario

回答

2

问题来自第2步。Promise.map已经返回承诺,因此您可以将其返回给被调用者。然后你用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); 
     }); 
    }); 
    }); 
} 
+0

它的工作原理!但出于好奇,如果你使用超时假冒异步调用它不起作用...为什么会这样? –

+0

我真的不明白你的问题,你如何伪造超时的异步电话?这可能只是因为异步调用在超时之前完成,以便从异步调用中获得结果,但这不是一个好主意,因为您永远不会知道哪一个先完成。 – iKoala

+0

是的,没关系,我只是想通过使用超时它近似做一个实际的异步调用。我懒惰的测试方式。无论如何,通过实际的异步调用来加载文件,它的功能非常好,谢谢你的帮助。 –

0

您没有正确拨打resolve回拨。

let step2 = function() { 
    things = []  
    return Promise.map(things, function(thing) {   
     return new Promise(function(resolve, reject) { 
      // load file async with callback 
      resolve(...) 
     }) 
    }) 
} 

在你的情况resolve()总是被调用,因为你正在执行异步函数加载文件。

相关问题