国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

詳解如何構建Promise隊列實現異步函數順序執行

2024-05-06 15:28:30
字體:
來源:轉載
供稿:網友

場景

有a、b、c三個異步任務,要求必須先執行a,再執行b,最后執行c

且下一次任務必須要拿到上一次任務執行的結果,才能做操作

思路

我們需要實現一個隊列,將這些異步函數添加進隊列并且管理它們的執行,隊列具有First In First Out的特性,也就是先添加進去的會被先執行,接著才會執行下一個(注意跟棧作區別)

大家也可以類比一下jQuery的animate方法,添加多個動畫也會按順序執行

解決

模擬3個異步函數

// 異步函數avar a = function () { return new Promise(function (resolve, reject) {  setTimeout(function () {   resolve('a')  }, 1000) })}// 異步函數bvar b = function (data) { return new Promise(function (resolve, reject) {  resolve(data + 'b') })}// 異步函數cvar c = function (data) { return new Promise(function (resolve, reject) {  setTimeout(function () {   resolve(data + 'c')  }, 500) })}

解決方法一(使用then鏈式操作)

特點:可以滿足需求,但是書寫比較繁瑣

代碼

//鏈式調用a() .then(function (data) {  return b(data) }) .then(function (data) {  return c(data) }) .then(function (data) {  console.log(data)// abc })

方法二(構建隊列)

特點:封裝方法,可移植到別處使用

代碼

// 構建隊列function queue(arr) { var sequence = Promise.resolve() arr.forEach(function (item) {  sequence = sequence.then(item) }) return sequence}// 執行隊列queue([a, b, c]) .then(data => {  console.log(data)// abc })

方法三(使用async、await構建隊列)

同方法二,只是顯得更高大上點

代碼

async function queue(arr) { let res = null for (let promise of arr) {  res = await promise(res) } return await res}queue([a, b, c]) .then(data => {  console.log(data)// abc })

順便說一句,bluebird的Promise.reduce也可以用來順序執行函數,但是可使用的場景非常有限,一般用來讀取文件信息,而以上給出的方法,不管你在異步函數中做了什么,只要函數最后返回了一個Promise對象,都可以使用

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持錯新站長站。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 乌拉特中旗| 容城县| 苍梧县| 吕梁市| 海南省| 惠水县| 砚山县| 青浦区| 陆良县| 苏尼特左旗| 浦东新区| 利津县| 阿克陶县| 潍坊市| 天等县| 岳西县| 岳池县| 兴业县| 渑池县| 亳州市| 黔东| 河南省| 健康| 舟山市| 德阳市| 上饶县| 陆川县| 尉氏县| 资兴市| 雷波县| 九寨沟县| 江门市| 监利县| 广灵县| 巩留县| 昭觉县| 维西| 舟曲县| 聊城市| 临夏市| 琼结县|