" />

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

深入了解JavaScript Promise

 更新時間:2021年12月28日 10:15:28   作者:Dormiveglia-flx  
這篇文章主要為大家介紹了JavaScript Promise,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

一 什么是 Promise?

一個 Promise 對象就像容器一樣,在容器中寫著一段執(zhí)行具體操作的代碼,并且在這段代碼執(zhí)行結(jié)束后,會執(zhí)行兩個回調(diào)函數(shù),一個是操作成功的回調(diào)函數(shù)(resolve),一個是操作失敗的回調(diào)函數(shù)(reject)

二 為什么有 Promise?

Promise 的出現(xiàn)是為了解決異步編程中,主要使用的回調(diào)機制的幾個問題:

  • Callback hell

Callback hell:Promise 可以把一層層嵌套的 callback 變成 .then().then()…,從而使代碼編寫和閱讀更直觀

  • 錯誤處理難:Promise 比 callback 在錯誤處理上更清晰直觀
  • 同時進行多個異步操作的代碼編寫困難:Promise 可以簡單處理此情況

三 Promise常用api

  • .then() promise中方法執(zhí)行完以后,可以執(zhí)行,里面有兩個參數(shù),分別是成功的回調(diào)函數(shù)和失敗的回調(diào)函數(shù)。
  • resolve 使用 promise.resolve 方法可以快速的返回一個promise對象
  • reject 使用 promise.reject 方法可以快速的返回一個promise對象
  • all 同時執(zhí)行多個并行異步操作。

四 Promise常用的兩個用法

1 如何解決 callback hell?

.then()沒有返回值的函數(shù),會使得 Promise 鏈不再延續(xù),此時你再往后面調(diào)用 .then() 是沒有作用的。

Promise.resolve('foo').then(function(s) {
  console.log(s);
}).then(function(s) {
  // Never executed
  console.log(s);
});

.then()中有返回值函數(shù),會使 Promise 鏈可以繼續(xù)

Promise.resolve('foo').then(function(s) {
  console.log(s);
  return s + 'bar';
}).then(function(s) {
  console.log(s);
});

// foo
// foobar

.then()有返回值且返回值為另一個 Promise 對象的函數(shù),也會使 Promise 繼續(xù)·。與前者的區(qū)別在于,再次調(diào)用.then()時可能會觸發(fā)的是異步操作,因此不是馬上觸發(fā)下一輪resolve()

Promise.resolve('foo').then(function(s) {
  return new Promise((resolve, reject) => {
      console.log(s);
      setTimeout(() => {
          resolve(s + 'bar')
        }, 1000);
    });
}).then(function(s) {
  console.log(s);
});


// foo
// foobar (在 "foo" 顯示了 1s 后顯示)

2 Promise.all() 實現(xiàn)并發(fā)同步接收返回值
應用場景描述(你需要同時調(diào)多個接口的數(shù)據(jù),并在前端對數(shù)據(jù)進行處理,這就需要等待所有接口返回數(shù)據(jù)后才能操作。)

// demo
const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, 'foo');
});
 
Promise.all([promise1, promise2, promise3]).then((values) => {
  console.log(values);
});
// expected output: Array [3, 42, "foo"]

Promise.all() 與 sync await區(qū)別

//sync await   操作時間2秒
async function Index2() {
      console.time()
      const p1 =await new Promise((resolve, reject) => {
        console.log('這里是p1')
        setTimeout(() => {
          resolve('這里是p1的返回')
        }, 1000)
      })
      const p2 =await new Promise((resolve, reject) => {
        console.log('這里是p2')
        setTimeout(() => {
          resolve('這里是p2的返回')
        }, 1000)
      })
      console.log(p1)
      console.log(p2) 
      console.timeEnd()
   }
    Index2();

在這里插入圖片描述

//  使用Promise.all()來實現(xiàn)調(diào)用。操作時間1秒
 function Index() {
      console.time()
      const p1 = new Promise((resolve, reject) => {
        console.log('這里是p1')
        setTimeout(() => {
          resolve('這里是p1的返回')
        }, 1000)
      })
      const p2 = new Promise((resolve, reject) => {
        console.log('這里是p2')
        setTimeout(() => {
          resolve('這里是p2的返回')
        }, 1000)
      })
      Promise.all([p1, p2]).then((val) => {
        console.log(val)
        console.timeEnd()
      })
}

在這里插入圖片描述

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內(nèi)容!

相關文章

  • JS promise解決異步問題過程詳解

    JS promise解決異步問題過程詳解

    Promise是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函數(shù)和事件——更合理和更強大。簡單說就是一個容器,里面保存著某個未來才會結(jié)束的事件(通常是一個異步操作)的結(jié)果。從語法上說,Promise是一個對象,從它可以獲取異步操作的消息
    2023-04-04
  • 兩個函數(shù)相互調(diào)用如何防止死循環(huán)

    兩個函數(shù)相互調(diào)用如何防止死循環(huán)

    這篇文章主要介紹了兩個函數(shù)相互調(diào)用如何防止死循環(huán)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • JavaScript防抖與節(jié)流超詳細全面講解

    JavaScript防抖與節(jié)流超詳細全面講解

    在開發(fā)中我們經(jīng)常會遇到一些高頻操作,比如:鼠標移動,滑動窗口,鍵盤輸入等等,節(jié)流和防抖就是對此類事件進行優(yōu)化,降低觸發(fā)的頻率,以達到提高性能的目的。本文就教大家如何實現(xiàn)一個讓面試官拍大腿的防抖節(jié)流函數(shù),需要的可以參考一下
    2022-10-10
  • JavaScript iframe 實現(xiàn)多窗口通信實例詳解

    JavaScript iframe 實現(xiàn)多窗口通信實例詳解

    這篇文章主要為大家介紹了JavaScript iframe 實現(xiàn)多窗口通信實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • IE6/7 and IE8/9/10(IE7模式)依次隱藏具有absolute或relative的父元素和子元素后再顯示父元素

    IE6/7 and IE8/9/10(IE7模式)依次隱藏具有absolute或relative的父元素和子元素后再顯示

    多數(shù)情況下隱藏(設置display:none)一個元素,無需依次將其內(nèi)的所有子元素都隱藏。非要這么做,有時會碰到意想不到的bug。
    2011-07-07
  • JavaScript之instanceof方法手寫示例詳解

    JavaScript之instanceof方法手寫示例詳解

    這篇文章主要為大家介紹了JavaScript之instanceof方法手寫示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • JavaScript代碼生成PDF文件的方法

    JavaScript代碼生成PDF文件的方法

    如何使用js生成pdf文件呢,下面通過本文給大家分享JavaScript代碼生成PDF文件的方法,需要的朋友參考下吧
    2016-02-02
  • JavaScript canvas實現(xiàn)流星特效

    JavaScript canvas實現(xiàn)流星特效

    這篇文章主要為大家詳細介紹了JavaScript canvas實現(xiàn)流星特效,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • 開發(fā)用到的js封裝方法(20種)

    開發(fā)用到的js封裝方法(20種)

    在本問中我們給大家總結(jié)了20種開發(fā)中常用到的JS封裝方法,有需要的讀者們可以學習下。
    2018-10-10
  • 微信小程序?qū)崿F(xiàn)數(shù)字滾動動畫

    微信小程序?qū)崿F(xiàn)數(shù)字滾動動畫

    這篇文章主要為大家詳細介紹了微信小程序?qū)崿F(xiàn)數(shù)字滾動動畫,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07

最新評論

泸定县| 英吉沙县| 加查县| 高要市| 秦皇岛市| 铜川市| 郯城县| 台湾省| 天镇县| 辉南县| 延吉市| 萍乡市| 平果县| 新津县| 都匀市| 东兰县| 安岳县| 皋兰县| 德昌县| 丽江市| 梧州市| 延安市| 龙州县| 连江县| 军事| 咸阳市| 荣昌县| 沙坪坝区| 定安县| 宿州市| 噶尔县| 沐川县| 锡林浩特市| 涪陵区| 正镶白旗| 凯里市| 萝北县| 大化| 沈丘县| 娱乐| 怀集县|