2016-11-19 46 views
1

我有一些函數存儲在一個數組中。 基本上我有兩個問題。鏈接承諾,但繼續下一個承諾,當一個失敗(並記錄拒絕)

  1. 如何將這個函數的數組變成鏈式承諾。 (長陣列) 東西中的線: funcs.reduce((prev, cur) => prev.then(cur), starting_promise);

    var promise = funcs[0](input); for (var i = 1; i < funcs.length; i++) promise = promise.then(funcs[i]);

  2. (這是主要的問題)會喜歡承諾鏈不拒絕時在鏈拒絕承諾之一。而是繼續與下一個,直到它到達最後。 (如果可能的話還可以捕捉拒絕,所以我可以輸出出錯的地方)

回答

2

你可以在reduce回調中處理拒絕;

funcs.reduce((prev, cur) => prev.then(cur).catch(log), starting_promise) 

或者你可以預先處理功能的陣列:

funcs.map(f => v => f(v).catch(log)) 
    .reduce((prev, cur) => prev.then(cur), starting_promise) 

在這兩種情況下,該點是catch提出的承諾回到成功的軌道上,因爲它是(除非你拋入捕獲處理程序)。

請注意,無論catch處理程序的返回值是否成爲承諾鏈中下一個函數的輸入值。如果你想拒絕的理由,成爲輸入,然後從catch處理程序返回它:

function log(reason) { 
    console.log("rejected with reason", reason, "continuing..."); 
    return reason; 
} 

從評論:

如何使用捕捉野狗參考 - >日誌功能?

而不是僅僅通過logcatch,通過這兩者的原因和函數調用log功能:

funcs.reduce(
    (prev, cur) => prev.then(cur).catch(reason => log(reason, cur)), 
    starting_promise) 

function log(reason, func) { 
    console.log("rejected with reason", reason, "in function", func, "continuing..."); 
    return reason; 
} 
+0

@Phoelpis記住,'cur'是不是一個承諾,而是一個函數返回一個promise。也許你的意思是你想要通過拒絕原因調用'cur'到'log'函數導致的承諾?呃,實際上它已經是了。對不起,如果我不明白你的問題。 – 2016-11-20 02:28:02