2017-04-10 118 views
2

我有一個服務器端Node.JS腳本來處理文件上傳(1)將上傳保存到特定位置和(2)將其記錄在數據庫中。我一直在使用Asynquence庫和它的門函數(相當於Promise.all)來並行執行這些步驟,但是我需要序列的行爲,以便如果任一步失敗,如果成功,則撤銷另一步。顯然,撤銷步驟只有在其匹配步驟已經成功時纔會執行(即刪除文件或db記錄)異步步驟,等待所有步驟成功或失敗

Gate似乎不適用於這種情況,因爲如果任何步驟失敗,它將觸發錯誤處理程序。有沒有等待所有步驟成功或失敗的函數?

+0

除了表現,你會發現按順序進行兩個階段會更簡單。因此,如果第一階段失敗了,則不需要撤銷任何東西;如果第二階段失敗了,只有第一階段需要撤消。 –

回答

1

如果您認爲catch作爲異步對口try,那麼你可以建立一個快速的包裝,包裝傳遞給gatePromise.all每一個值,並返回一個「成功」或「失敗」的結果。

function waitForAll(inputArray) { 
    // Return Promise.all on an array where for each array value... 
    return Promise.all(inputArray.map(function(x) 
    // ...we wrap it in a tiny dict with the semantics we want. 
    return Promise.resolve(x).then(function(value) { 
     return { success: true, value: value }; 
    }, function(error) { 
     return { success: false, error: error }; 
    }); 
    })); 
} 

作爲獎勵,因爲你可以把每個承諾任何行動,你的包裝,你甚至可以通過一個單獨的渠道迅速及時報告故障,或者立即開始取消或回滾成功的行動爲任何異步步驟失敗。