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

JavaScript promise的使用和原理分析

 更新時間:2023年04月12日 09:59:34   作者:肥肥呀呀呀  
Promise 是一個 ECMAScript 6 提供的類,目的是更加優(yōu)雅地書寫復雜的異步任務。由于 Promise 是 ES6 新增加的,所以一些舊的瀏覽器并不支持,蘋果的 Safari 10 和 Windows 的 Edge 14 版本以上瀏覽器才開始支持 ES6 特性

一、為什么一個promise可以調用多個.then方法

如下面的:

const promise = new Promise((resolve, reject) => {
  resolve("hahaha")
})
// 1.同一個Promise可以被多次調用then方法
// 當我們的resolve方法被回調時, 所有的then方法傳入的回調函數(shù)都會被調用
promise.then(res => {
  console.log("res1:", res)    //hahaha
})
promise.then(res => {
  console.log("res2:", res)    //hahaha
})
promise.then(res => {
  console.log("res3:", res)    //hahaha
})

答案:

  • then內回調 不返回任何值,默認返回當前Promise
  • then內回調 返回Promise
  • then內回調 返回 普通值(數(shù)值/字符串/普通對象/undefined),普通的值被作為一個新的Promise的resolve值

二、什么是Promise.resolve()

Promise.resolve() 表示狀態(tài)為fulfilled的promise對象

Promise.resolve()
// 等同于
new Promise((resolve)=>{resolve()})

為什么會有下面的執(zhí)行結果? 感覺十分異常

Promise.resolve().then(() => {
  console.log(0);
  return Promise.resolve(4)
}).then(res => {
  console.log(res)
})
Promise.resolve().then(() => {
  console.log(1);
}).then(() => {
  console.log(2);
}).then(() => {
  console.log(3);
}).then(() => {
  console.log(5);
}).then(() =>{
  console.log(6);
})
// 0,1,2,3,4,5,6
(
  async function() {
    return Promise.resolve()
  }
)().then(()=>{
  console.log(1)
})
new Promise((resolve) => {
  resolve()
}).then(()=>{
  console.log(2)
}).then(()=>{
  console.log(3)
})
/// 2 3 1

答案:

如果promise內返回的對象具有可調用的then方法,則會在微任務隊列中再插入一個任務NewPromiseResolveThenableJob,這就慢了一拍;這個任務會執(zhí)行這個then方法,如果這個then方法是來自于promise的,則因為是異步的又慢了一拍,所以一共慢了兩拍。

參考

三、Promise.all缺陷和Promise.allSettled

Promise.all() 的缺陷

其中任意一個 promise 被 reject ,Promise.all 就會立即被 reject ,不在執(zhí)行then。

數(shù)組中其它未執(zhí)行完的 promise 依然是在執(zhí)行的,但是Promise.all 沒有返回它們的結果,同時Promise.all 沒有采取任何措施來取消它們的執(zhí)行。

Promise.allSettled()

Promise.allSettled() 可以獲取數(shù)組中每個 promise 的結果,無論成功或失敗

只有then方法 所有結果都會在then中體現(xiàn)

注意

彼此相互依賴,一個失敗全部失效(全無或全有)用 Promise.all ;相互獨立,獲取每個結果用 Promise.allSettled

四、Promise.race() 使用

多個promise執(zhí)行,最快的執(zhí)行Promise.race()的then或者catch

里面的promise依舊會執(zhí)行

const promise1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('Promise 1 resolved');
      console.log(0)
  }, 1000);
});
const promise2 = new Promise((resolve, reject) => {
  setTimeout(() => {
      console.log(2)
    resolve('Promise 2 resolved');
  }, 2000);
});
Promise.race([promise1, promise2]).then(result => {
  console.log(result); // "Promise 1 resolved"
});
// 0
//Promise 1 resolved
//2

到此這篇關于JavaScript promise的使用和原理分析的文章就介紹到這了,更多相關JS promise內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 全面了解JavaScript的作用域鏈

    全面了解JavaScript的作用域鏈

    這是一個非常重要的知識點了,了解了JavaScript的作用域鏈的話,能幫助我們理解很多‘異?!瘑栴}。文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • javascript中對象的定義、使用以及對象和原型鏈操作小結

    javascript中對象的定義、使用以及對象和原型鏈操作小結

    這篇文章主要介紹了javascript中對象的定義、使用以及對象和原型鏈操作,結合實例形式總結分析了javascript對象操作的常用技巧,需要的朋友可以參考下
    2016-12-12
  • JS 控件事件小結

    JS 控件事件小結

    事件對于控件來說至關重要,控件的消息通信機制使用事件的成本最低,但是對于JS控件來說有一些麻煩需要解決,JS類本身不支持事件,DOM模型支持的事件僅適應于瀏覽器的DOM節(jié)點。所以創(chuàng)建一套事件是我們寫控件之前要做的
    2012-10-10
  • js split函數(shù)用法總結(從入門到精通)

    js split函數(shù)用法總結(從入門到精通)

    js split就是將一字符串以特定的字符分割成數(shù)組,數(shù)組一般是字符串處理比較常用的處理方法
    2013-03-03
  • JavaScript錯誤處理和調試方法詳解

    JavaScript錯誤處理和調試方法詳解

    代碼審查是調試JavaScript的重要方法,因為它允許多個開發(fā)人員一起處理代碼庫并在開發(fā)過程的早期發(fā)現(xiàn)錯誤,這篇文章主要給大家介紹了關于JavaScript錯誤處理和調試方法的相關資料,需要的朋友可以參考下
    2023-11-11
  • javascript中的面向對象

    javascript中的面向對象

    本文主要介紹了javascript中面向對象的相關知識。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-03-03
  • JavaScript返回當前會話cookie全部鍵值對照的方法

    JavaScript返回當前會話cookie全部鍵值對照的方法

    這篇文章主要介紹了JavaScript返回當前會話cookie全部鍵值對照的方法,涉及javascript操作cookie的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • 判斷“命令按鈕”是否被鼠標單擊詳解

    判斷“命令按鈕”是否被鼠標單擊詳解

    在本篇文章里小編給各位分享的是關于判斷“命令按鈕”是否被鼠標單擊的相關知識點內容,有需要的朋友們參考下。
    2019-07-07
  • 微信小程序實現(xiàn)收縮式菜單

    微信小程序實現(xiàn)收縮式菜單

    這篇文章主要為大家詳細介紹了微信小程序實現(xiàn)收縮式菜單,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • filters.revealTrans.Transition使用方法小結

    filters.revealTrans.Transition使用方法小結

    有看到幻燈片調用會用到divid.filters.revealTrans.Transition=Math.floor(Math.random()*23)和divid.filters.revealTrans.apply(),那么這兩個都是什么意思呢?
    2010-08-08

最新評論

湖北省| 安龙县| 获嘉县| 昌宁县| 靖远县| 萨迦县| 德钦县| 仁怀市| 阳泉市| 奇台县| 南宫市| 尉犁县| 阿尔山市| 平陆县| 襄城县| 涟水县| 小金县| 鹿邑县| 尼木县| 沧州市| 井冈山市| 长顺县| 卓资县| 奎屯市| 普陀区| 黑河市| 江西省| 尖扎县| 青浦区| 肥乡县| 牙克石市| 礼泉县| 长阳| 会东县| 吉安市| 玛纳斯县| 水城县| 吉林省| 盐津县| 清镇市| 莫力|