2016-11-24 57 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()總是被調用,因爲你正在執行異步函數加載文件。

相關問題