最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2018年10月23日 08:41:54   作者:vcxiaohan2  
這篇文章主要介紹了詳解如何構建Promise隊列實現異步函數順序執(zhí)行,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

場景

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

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

思路

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

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

解決

模擬3個異步函數

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

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

// 異步函數c
var 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
}

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

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

相關文章

  • js+HTML5實現視頻截圖的方法

    js+HTML5實現視頻截圖的方法

    這篇文章主要介紹了js+HTML5實現視頻截圖的方法,涉及javascript操作html5元素實現多媒體文件截圖的相關技巧,需要的朋友可以參考下
    2015-06-06
  • JavaScript 拖拉縮放效果

    JavaScript 拖拉縮放效果

    拖拉縮放效果,實現通過鼠標拖動來調整層的面積(寬高)大小。例如選框效果。
    2008-12-12
  • JavaScript 事件屬性綁定帶參數的函數

    JavaScript 事件屬性綁定帶參數的函數

    在JavaScript中,為了實現表現和控制相分離,可以通過0級的DOM事件屬性或者2級的事件模型來實現,不過這兩者在針對某個事件類型調用相應的事件句柄的時候,不能給事件句柄提供參數,也就是說,事件屬性的值只能是一個函數引用。
    2009-03-03
  • js構建二叉樹進行數值數組的去重與優(yōu)化詳解

    js構建二叉樹進行數值數組的去重與優(yōu)化詳解

    這篇文章主要給大家介紹了關于js構建二叉樹進行數值數組的去重與優(yōu)化的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-03-03
  • JS彈出居中的DIV的代碼

    JS彈出居中的DIV的代碼

    一直都在想怎么樣使彈出的DIV能在任何時候都是居中顯示的,剛開始的時候是用CSS樣式直接定義好層的位置,但是當頁面很長的時候,或是瀏覽器窗口大小不是固定的時候就不能正確的顯示,所以只好用JS來控制DIV的顯示位置。
    2008-06-06
  • jquery獲取radio值(單選組radio)

    jquery獲取radio值(單選組radio)

    jquery獲取radio值使用到特殊的選擇器type=radio,為方便大家理解,另附一個jquery實例,想學習的朋友可以看看
    2014-10-10
  • JavaScript數組的棧方法與隊列方法詳解

    JavaScript數組的棧方法與隊列方法詳解

    這篇文章主要介紹了JavaScript數組的棧方法與隊列方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-05-05
  • js的表單操作 簡單計算器

    js的表單操作 簡單計算器

    javascript寫的簡單的加減乘除計算器,里面涉及到一些方法還是很實用的哦,新手不要錯過
    2011-12-12
  • javascript實現時鐘動畫

    javascript實現時鐘動畫

    這篇文章主要為大家詳細介紹了javascript實現時鐘動畫,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • JS通過相同的name進行表格求和代碼

    JS通過相同的name進行表格求和代碼

    表格求和想必大家并不陌生,下面為大家詳細介紹下通過相同的name進行表格求和,具體實現如下,感興趣的朋友可以參考下,希望對大家有所幫助
    2013-08-08

最新評論

徐水县| 三明市| 文登市| 襄汾县| 独山县| 西丰县| 绍兴县| 富裕县| 青州市| 瑞金市| 隆子县| 大悟县| 奉化市| 鱼台县| 墨竹工卡县| 西乡县| 清水县| 松桃| 全州县| 封开县| 通化市| 金川县| 武山县| 云霄县| 霍邱县| 淮北市| 温州市| 天门市| 香港| 紫阳县| 阿鲁科尔沁旗| 建昌县| 灵璧县| 浦县| 炉霍县| 麦盖提县| 甘南县| 渝北区| 黔南| 庄浪县| 丁青县|