跳到主要內容

JavaScript 依序執行 Promise Task

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 的概念就能包裝出符合自己需求的函式

留言