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

JS中Promise函數(shù)then的奧秘探究

 更新時(shí)間:2018年07月30日 08:45:56   作者:donglegend  
then()方法用于指定當(dāng)前實(shí)例狀態(tài)發(fā)生改變時(shí)的回調(diào)函數(shù)。它返回一個(gè)新的Promise實(shí)例。下面這篇文章主要給大家介紹了關(guān)于JS中Promise函數(shù)then的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧

Promise概述

Promise對(duì)象是CommonJS工作組提出的一種規(guī)范,目的是為異步操作提供統(tǒng)一接口。

那么,什么是Promises?

首先,它是一個(gè)對(duì)象,也就是說與其他JavaScript對(duì)象的用法,沒有什么兩樣;其次,它起到代理作用(proxy),充當(dāng)異步操作與回調(diào)函數(shù)之間的中介。它使得異步操作具備同步操作的接口,使得程序具備正常的同步運(yùn)行的流程,回調(diào)函數(shù)不必再一層層嵌套。

簡單說,它的思想是,每一個(gè)異步任務(wù)立刻返回一個(gè)Promise對(duì)象,由于是立刻返回,所以可以采用同步操作的流程。這個(gè)Promises對(duì)象有一個(gè)then方法,允許指定回調(diào)函數(shù),在異步任務(wù)完成后調(diào)用。

Promise的then方法可以接受前一個(gè)函數(shù)的執(zhí)行結(jié)果,還可以保證另一個(gè)Promise的順序執(zhí)行,這到底是怎么做到的呢?

原理圖(先上圖)

問題需求

如何保證多個(gè) promise 順序執(zhí)行?

實(shí)例:

var f1 = function (){
 return new Promise(function (resolve, reject){
  setTimeout(function (){
   console.log("f1 ok!")
   resolve("f1 ok!");
  }, 1000)
 });
}
var f2 = function (){
 return new Promise(function (resolve, reject){
  setTimeout(function (){
   console.log("f2 ok!")
   resolve("f2 ok!");
  }, 3000)
 });
}
var f3 = function (){
 return new Promise(function (resolve, reject){
  setTimeout(function (){
   console.log("f3 ok!")
   resolve("f3 ok!");
  }, 2000)
 });
}

當(dāng)然如果要并行的話,我們很容易想到 Promise.all 方法:

Promise.all([f1(), f2(), f3()]).then(function (data){
 console.log(data)
})
// f1 ok! 
// f3 ok! 
// f2 ok! 
// ["f1 ok!", "f2 ok!", "f3 ok!"]

如果要順序執(zhí)行:

f1().then(f2).then(f3)
// f1 ok!
// f2 ok!
// f3 ok!

//或者這樣

function f(all) {
 var promise = Promise.resolve();
 all.forEach((p, index) => {
  promise = promise.then(p)
 })
}
f([f1, f2, f3])

那么問題來了,then是如何做到順序執(zhí)行的呢,參數(shù)既可以是一個(gè)普通函數(shù),也可是是一個(gè)返回promise的函數(shù)?

then的奧秘

很多實(shí)現(xiàn)promise的庫都比較復(fù)雜,如果自己實(shí)現(xiàn)的話,可以借鑒下面簡單的代碼:

Promise.prototype.then = function(onFulfilled, onRejected) {
 var promise = this;
 return new Promise(function(resolve, reject) {
  function handle(value) {
   var ret = typeof onFulfilled === 'function' && onFulfilled(value) || value;
   if (ret && typeof ret['then'] == 'function') {
    ret.then(function(value) {
     resolve(value);
    }, function(reason) {
     reject(reason);
    });
   } else {
    resolve(ret);
   }
  }
  function errback(reason) {
   reason = typeof onRejected === 'function' && onRejected(reason) || reason;
   reject(reason);
  }
  if (promise._status === 'PENDING') {
   promise._resolves.push(handle);
   promise._rejects.push(errback);
  } else if (promise._status === FULFILLED) { 
   callback(promise._value);
  } else if (promise._status === REJECTED) {
   errback(promise._reason);
  }
 });
}

重點(diǎn)在then的實(shí)現(xiàn),看上述代碼,每個(gè)then返回的是什么,是一個(gè)新的 Promise,一個(gè)新的 Promise,一個(gè)新的 Promise
第二個(gè)重點(diǎn)是,在內(nèi)部又處理了一個(gè) 回調(diào)函數(shù)運(yùn)行結(jié)果是 一個(gè) promise的 判斷,如果是那么等待這個(gè)promise運(yùn)行結(jié)束才調(diào)用 resolve 更改狀態(tài),關(guān)鍵是resolve的調(diào)用時(shí)機(jī),resolve的調(diào)用時(shí)機(jī),才能夠往下執(zhí)行,這兩步就是then函數(shù)的關(guān)鍵。
是不是 有點(diǎn)暈,請(qǐng)看最開始的圖。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • javascript showModalDialog,open取得父窗口的方法

    javascript showModalDialog,open取得父窗口的方法

    showModalDialog,open取得父窗口的代碼,需要的朋友可以參考下。
    2010-03-03
  • 純前端生成PDF(jsPDF)并下載保存或上傳到OSS的代碼示例

    純前端生成PDF(jsPDF)并下載保存或上傳到OSS的代碼示例

    這篇文章主要介紹了純前端生成PDF(jsPDF)并下載保存或上傳到OSS的相關(guān)資料,主要步驟包括獲取DOM節(jié)點(diǎn)、生成PDF、保存或上傳PDF,文章還提到了一些注意事項(xiàng),需要的朋友可以參考下
    2025-01-01
  • javascript判斷是手機(jī)還是電腦訪問網(wǎng)頁的簡單實(shí)例分享

    javascript判斷是手機(jī)還是電腦訪問網(wǎng)頁的簡單實(shí)例分享

    在智能手機(jī)越來越普及甚至是泛濫的時(shí)候,確實(shí)給大家的生活帶來了很大的方便,但是對(duì)于web前端設(shè)計(jì)師來說,可就麻煩多了,現(xiàn)在很多的網(wǎng)站在制作過程中都要考慮到手機(jī)訪問的問題,那么我們?nèi)绾蝸砼袛嗫蛻舳耸遣皇鞘謾C(jī)呢,下面分享個(gè)例子吧
    2014-06-06
  • JavaScript中for?in和for?of的區(qū)別示例詳解

    JavaScript中for?in和for?of的區(qū)別示例詳解

    在JavaScript中for...in和for...of是兩種不同的循環(huán)結(jié)構(gòu),它們各自有特定的用途和特點(diǎn),這篇文章主要介紹了JavaScript中for?in和for?of區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2025-06-06
  • TypeScript 運(yùn)行時(shí)類型檢查補(bǔ)充工具

    TypeScript 運(yùn)行時(shí)類型檢查補(bǔ)充工具

    這篇文章主要介紹了TypeScript 運(yùn)行時(shí)類型檢查補(bǔ)充工具,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • javascript命名約定(變量?函數(shù)?類?組件)

    javascript命名約定(變量?函數(shù)?類?組件)

    這篇小文章主要是通過一些例子來介紹一些Javascript中一些關(guān)于命名變量,函數(shù),類或者是組件的通用約定,雖然這些規(guī)則并不是強(qiáng)制性的,但是呢,他們卻被一些JS社區(qū)所廣泛采用,所以,了解他們還是很有必要的
    2023-03-03
  • JavaScript實(shí)現(xiàn)帶箭頭標(biāo)識(shí)的多級(jí)下拉菜單效果

    JavaScript實(shí)現(xiàn)帶箭頭標(biāo)識(shí)的多級(jí)下拉菜單效果

    這篇文章主要介紹了JavaScript實(shí)現(xiàn)帶箭頭標(biāo)識(shí)的多級(jí)下拉菜單效果,可實(shí)現(xiàn)橫向與縱向箭頭的形式標(biāo)識(shí)選中菜單項(xiàng)位置的功能,涉及javascript針對(duì)頁面元素位置的判定與樣式動(dòng)態(tài)操作技巧,需要的朋友可以參考下
    2015-08-08
  • 枚舉JavaScript對(duì)象的函數(shù)

    枚舉JavaScript對(duì)象的函數(shù)

    枚舉JavaScript對(duì)象的函數(shù)...
    2006-12-12
  • JS和Canvas實(shí)現(xiàn)圖片的預(yù)覽壓縮和上傳功能

    JS和Canvas實(shí)現(xiàn)圖片的預(yù)覽壓縮和上傳功能

    這篇文章主要介紹了JS和Canvas實(shí)現(xiàn)圖片的預(yù)覽壓縮和上傳功能,實(shí)現(xiàn)此功能大概有兩步,第一步用戶選擇需要上傳的圖片,第二步獲取圖片資源壓縮預(yù)覽上傳,具體實(shí)現(xiàn)代碼大家參考下本文
    2018-03-03
  • vue/js實(shí)現(xiàn)頁面自動(dòng)往上滑動(dòng)效果

    vue/js實(shí)現(xiàn)頁面自動(dòng)往上滑動(dòng)效果

    這篇文章主要為大家詳細(xì)介紹了vue/js實(shí)現(xiàn)頁面自動(dòng)往上滑動(dòng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04

最新評(píng)論

梁平县| 手游| 上犹县| 朝阳区| 澄城县| 广元市| 营山县| 商丘市| 原阳县| 交城县| 墨竹工卡县| 惠安县| 呼伦贝尔市| 临城县| 新宁县| 浦东新区| 沭阳县| 积石山| 福泉市| 定远县| 永宁县| 成安县| 霍邱县| 江油市| 博罗县| 射阳县| 蒙城县| 广灵县| 大安市| 永丰县| 泌阳县| 泰兴市| 屏东县| 久治县| 读书| 岐山县| 招远市| 东平县| 乾安县| 垫江县| 临城县|