最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

詳解如何構(gòu)建Promise隊(duì)列實(shí)現(xiàn)異步函數(shù)順序執(zhí)行

來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:05:56
文檔

詳解如何構(gòu)建Promise隊(duì)列實(shí)現(xiàn)異步函數(shù)順序執(zhí)行

詳解如何構(gòu)建Promise隊(duì)列實(shí)現(xiàn)異步函數(shù)順序執(zhí)行:場景 有a、b、c三個異步任務(wù),要求必須先執(zhí)行a,再執(zhí)行b,最后執(zhí)行c 且下一次任務(wù)必須要拿到上一次任務(wù)執(zhí)行的結(jié)果,才能做操作 思路 我們需要實(shí)現(xiàn)一個隊(duì)列,將這些異步函數(shù)添加進(jìn)隊(duì)列并且管理它們的執(zhí)行,隊(duì)列具有First In First Out的特性,也就是
推薦度:
導(dǎo)讀詳解如何構(gòu)建Promise隊(duì)列實(shí)現(xiàn)異步函數(shù)順序執(zhí)行:場景 有a、b、c三個異步任務(wù),要求必須先執(zhí)行a,再執(zhí)行b,最后執(zhí)行c 且下一次任務(wù)必須要拿到上一次任務(wù)執(zhí)行的結(jié)果,才能做操作 思路 我們需要實(shí)現(xiàn)一個隊(duì)列,將這些異步函數(shù)添加進(jìn)隊(duì)列并且管理它們的執(zhí)行,隊(duì)列具有First In First Out的特性,也就是

場景

有a、b、c三個異步任務(wù),要求必須先執(zhí)行a,再執(zhí)行b,最后執(zhí)行c

且下一次任務(wù)必須要拿到上一次任務(wù)執(zhí)行的結(jié)果,才能做操作

思路

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

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

解決

模擬3個異步函數(shù)

// 異步函數(shù)a
var a = function () {
 return new Promise(function (resolve, reject) {
 setTimeout(function () {
 resolve('a')
 }, 1000)
 })
}

// 異步函數(shù)b
var b = function (data) {
 return new Promise(function (resolve, reject) {
 resolve(data + 'b')
 })
}

// 異步函數(shù)c
var c = function (data) {
 return new Promise(function (resolve, reject) {
 setTimeout(function () {
 resolve(data + 'c')
 }, 500)
 })
}

解決方法一(使用then鏈?zhǔn)讲僮?

特點(diǎn):可以滿足需求,但是書寫比較繁瑣

代碼

//鏈?zhǔn)秸{(diào)用
a()
 .then(function (data) {
 return b(data)
 })
 .then(function (data) {
 return c(data)
 })
 .then(function (data) {
 console.log(data)// abc
 })

方法二(構(gòu)建隊(duì)列)

特點(diǎn):封裝方法,可移植到別處使用

代碼

// 構(gòu)建隊(duì)列
function queue(arr) {
 var sequence = Promise.resolve()
 arr.forEach(function (item) {
 sequence = sequence.then(item)
 })
 return sequence
}

// 執(zhí)行隊(duì)列
queue([a, b, c])
 .then(data => {
 console.log(data)// abc
 })

方法三(使用async、await構(gòu)建隊(duì)列)

同方法二,只是顯得更高大上點(diǎn)

代碼

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也可以用來順序執(zhí)行函數(shù),但是可使用的場景非常有限,一般用來讀取文件信息,而以上給出的方法,不管你在異步函數(shù)中做了什么,只要函數(shù)最后返回了一個Promise對象,都可以使用

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

詳解如何構(gòu)建Promise隊(duì)列實(shí)現(xiàn)異步函數(shù)順序執(zhí)行

詳解如何構(gòu)建Promise隊(duì)列實(shí)現(xiàn)異步函數(shù)順序執(zhí)行:場景 有a、b、c三個異步任務(wù),要求必須先執(zhí)行a,再執(zhí)行b,最后執(zhí)行c 且下一次任務(wù)必須要拿到上一次任務(wù)執(zhí)行的結(jié)果,才能做操作 思路 我們需要實(shí)現(xiàn)一個隊(duì)列,將這些異步函數(shù)添加進(jìn)隊(duì)列并且管理它們的執(zhí)行,隊(duì)列具有First In First Out的特性,也就是
推薦度:
標(biāo)簽: 執(zhí)行 隊(duì)列 promise
  • 熱門焦點(diǎn)

最新推薦

猜你喜歡

熱門推薦

專題
Top