2014-10-11 41 views
1

我有一個未知數量的可能從請求運行的異步進程。有一段文本要被這些進程修改。bluebird .all()不會調用。然後

UpdateScript與要修改的文本一起被調用,它有一個回調函數,我希望在所有內容都完成時運行。

var promise = require('bluebird'); 

function updateScript(text, cb){ 
    var funcChain = [], 
     re = some_Regular_Expression, 
     mods = {text: text}; 
    while (m = re.exec(mods.text)) { 
     // The text is searched for keywords. If found a subprocess will fire 
     .... 
     funcChain.push(changeTitleAsync(keyword, mods)); 
    } 
    promise.all(funcChain) 
    .then(function(){ 
     // This is never called. 
     cb(mods.text); 
    }); 
} 

function changeTitle(encryptedId, mods){ 
    try{ 
     // database request modifies mods.text 
    }catch(e){ 
    throw e; 
    } 
} 
var changeTitleAsync = promise.promisify(changeTitle); 

的changeTitle代碼的調用,但「則」呼叫不是

回答

2

晴的問題是不正確的使用promisify()。這是爲了將一個回調作爲最後一個參數的節點式函數轉換成一個返回promise的節點式函數(see docs here)。

你可以用上面的功能做相反的是有它手動返回一個新的承諾是這樣的:

function changeTitle(encryptedId, mods) { 
    return new Promise(function(resolve, reject){ 
    try { 
     // do something then resolve promise with results 
     var result = ... 
     resolve(result) 
    } catch (e) { 
     // reject the promise with caught error 
     reject(e) 
    } 
    }) 
} 

無論其 上面有一個錯誤:我假設數據庫調用來更新文本也是異步的,因此try/catch塊永遠不會捕獲任何東西,因爲它會在db啓動時運行。

所以你必須做的是讓數據庫調用自己。如果您使用的是節點數據庫庫(如Mongoose等),則可以運行Promise.promisifyAll(),並使用Async版本的功能(有關詳細信息,請參閱上面鏈接的promisifyAll部分)。

希望這有助於!

+0

嘗試捕捉是不必要的,完全相同的事情已經發生自動 – Esailija 2014-10-14 11:27:17

相關問題