Promise 在 JavaScript 上已經不算太新的規格了
不過作為在 IE 環境下能被正常支援的規格(包含打pollyfill),還是會常被使用
這篇來寫如果有需求要讓未定數量的 Promise依序進行相同的任務的方法
我們知道 Promise 執行後會回傳新的 Promise
而原本的 Promise 在這之後不管接任何呼叫都不會再觸發 Promise 的處理
利用 Array.prototype.reduce 的特性
我們可以包裝出一個總是使用最新的 Promise 結果繼續進行下去的流程
function sequence(tasks, fn) {
return tasks.reduce(function (promise, task) {
return promise.then(function () {
return fn(task);
});
}, Promise.resolve());
}
實際任務就能像這樣進行
function taskWrapper(param) {
return new Promise(function(resolve, reject) {
ajaxCall(resolve, '...', param);
});
}
sequence([1,2,3,4,5,6], taskWrapper);
第一個參數的內容將會一個一個做為每次被傳入的執行參數
ajaxCall 那段沒有實際意義,替換成自己的非同步呼叫即可
視自己的流程並不一定用同樣的包法
只要使用 Array.prototype.reduce 的概念就能包裝出符合自己需求的函式
不過作為在 IE 環境下能被正常支援的規格(包含打pollyfill),還是會常被使用
這篇來寫如果有需求要讓未定數量的 Promise依序進行相同的任務的方法
我們知道 Promise 執行後會回傳新的 Promise
而原本的 Promise 在這之後不管接任何呼叫都不會再觸發 Promise 的處理
利用 Array.prototype.reduce 的特性
我們可以包裝出一個總是使用最新的 Promise 結果繼續進行下去的流程
function sequence(tasks, fn) {
return tasks.reduce(function (promise, task) {
return promise.then(function () {
return fn(task);
});
}, Promise.resolve());
}
實際任務就能像這樣進行
function taskWrapper(param) {
return new Promise(function(resolve, reject) {
ajaxCall(resolve, '...', param);
});
}
sequence([1,2,3,4,5,6], taskWrapper);
第一個參數的內容將會一個一個做為每次被傳入的執行參數
ajaxCall 那段沒有實際意義,替換成自己的非同步呼叫即可
視自己的流程並不一定用同樣的包法
只要使用 Array.prototype.reduce 的概念就能包裝出符合自己需求的函式
留言
張貼留言