Promise非同步函式順序執行的四種方法

2021-09-13 10:57:53 字數 1591 閱讀 1162

前幾天遇到乙個程式設計題,要求控制promise順序執行,今天總結了一下這個至少有好四種方法都可以實現,包括promise巢狀,通過乙個promise串起來,generator,async實現,以下逐一介紹。

原題目如下:

//實現mergepromise函式,把傳進去的陣列順序先後執行,

//並且把返回的資料先後放到陣列data中

const timeout = ms => new promise((resolve, reject) => , ms);

});const ajax1 = () => timeout(2000).then(() => );

const ajax2 = () => timeout(1000).then(() => );

const ajax3 = () => timeout(2000).then(() => );

function mergepromise(ajaxarray)

mergepromise([ajax1, ajax2, ajax3]).then(data => );

// 分別輸出

// 1

// 2

// 3

// done

// [1, 2, 3]

function mergepromise1(ajaxarray) ).then(data=>).then(data=>);

}

function mergepromise2(ajaxarray) );

});return p;

}

此方法相對於上面的方法簡單並且書寫直觀易懂,還有一種類似的任務佇列,將陣列按順序從左邊頭部取出乙個執行,執行完成後觸發自定義next方法,next方法負責從陣列中取出下乙個任務執行。

var mergepromise3 = function* (ajaxarray) 

//自動執行的run

function run(fn)

let result = g.next(predata); //獲取每一步執行結果,其中value為promise物件,done表示是否執行完成

if (result.done)

else );}}

next();

});}

使用這種方法需要修改mergepromise方法為:
run(mergepromise3([ajax1, ajax2, ajax3])).then(data => );
const co = require('co')

co(mergepromise3([ajax1, ajax2, ajax3])).then(data => );

此方法原理和上面一樣,只是使用已有的封裝好的co模組來自動執行

function mergepromise4(ajaxarray) 

return arr;

} return run();

}

Promise非同步函式順序執行的四種方法

前幾天遇到乙個程式設計題,要求控制promise順序執行,今天總結了一下這個至少有好四種方法都可以實現,包括promise巢狀,通過乙個promise串起來,generator,async實現,以下逐一介紹。原題目如下 實現mergepromise函式,把傳進去的陣列順序先後執行,並且把返回的資料先...

promise執行順序總結

1 const promise new promise resolve,reject promise.then console.log 5 執行結果是 1,2,5,4 解釋 promise的建構函式是同步執行,promise.then中的函式是非同步執行。2 const promise new pr...

Promise 非同步函式順序問題解決

在專案中 寫到for迴圈結束之後再去呼叫乙個函式 我用的是vue 記錄一下 這裡是迴圈得到一些資料之後再進行函式呼叫 const arr const that this that.imagestrs that.imageidtemparr var arr console.log this.imgli...