亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Promise對(duì)象

?。?。 / 2916人閱讀

摘要:對(duì)比回調(diào)函數(shù)和暫時(shí)不管是什么,先看一下下面的代碼,看一看的好處?;卣{(diào)函數(shù)執(zhí)行一次首先,定義一個(gè)回調(diào)函數(shù),調(diào)用一次,看看這個(gè)代碼的寫法。上面的代碼中,在方法中需要傳遞兩個(gè)回調(diào)函數(shù),這樣看著會(huì)有點(diǎn)亂。

對(duì)比回調(diào)函數(shù)和Promise

暫時(shí)不管Promise是什么,先看一下下面的代碼,看一看Promise的好處。需要特別說(shuō)明的是,在這個(gè)對(duì)比的中,Promise和回調(diào)都沒(méi)有考慮存在異常的情況。

回調(diào)函數(shù)執(zhí)行一次

首先,定義一個(gè)回調(diào)函數(shù),調(diào)用一次,看看這個(gè)代碼的寫法。

"use strict";

// 定義一個(gè)計(jì)數(shù)器,用來(lái)統(tǒng)計(jì)回調(diào)函數(shù)執(zhí)行的次數(shù)
let count = 1;

/**
 * 定義一個(gè)異步執(zhí)行函數(shù),參數(shù)是回調(diào)函數(shù)
 */
function asyncFunc(callback) {
  setTimeout(function () {
    callback(`callback ... 執(zhí)行了 ${count} 次`);
    count++;
  }, 1000);
};

// 調(diào)用函數(shù)
asyncFunc(function(data){
  console.log(data);
});

/*************************************
callback ... 執(zhí)行了 1 次
*************************************/

如果用Promise改寫,會(huì)是什么樣的效果呢?

"use strict";

// 定義一個(gè)計(jì)數(shù)器,用來(lái)統(tǒng)計(jì)回調(diào)函數(shù)執(zhí)行的次數(shù)
let count = 1;

/**
 * 定義一個(gè)異步執(zhí)行函數(shù),返回值是一個(gè)Promise對(duì)象
 */
function asyncFunc() {
  let promise = new Promise(function (resolve, reject) {
    setTimeout(function () {
      resolve(`resolve ... 執(zhí)行了 ${count} 次`);
      count++;
    }, 1000);
  });
  return promise;
};

// 調(diào)用函數(shù)
asyncFunc().then(function(data){
  console.log(data);
});

/*************************************
resolve ... 執(zhí)行了 1 次
*************************************/

怎么感覺(jué)代碼更復(fù)雜,更加難于理解了?確實(shí),在定義函數(shù)的時(shí)候,需要返回一個(gè)Promise對(duì)象,增加了代碼量,看著沒(méi)什么優(yōu)勢(shì)。從這點(diǎn)來(lái)看,學(xué)這個(gè)東西,完全沒(méi)有必要啊。

別著急,接著往下走。。。。

回調(diào)函數(shù)執(zhí)行多次

上面的情況只是調(diào)用一次函數(shù),那么調(diào)用多次呢?比如調(diào)用個(gè)五次、七次。下面咱們看看調(diào)用七次的情況。

首先,還是先看看使用回調(diào)函數(shù)的情況:

"use strict";

// 定義一個(gè)計(jì)數(shù)器,用來(lái)統(tǒng)計(jì)回調(diào)函數(shù)執(zhí)行的次數(shù)
let count = 1;

/**
 * 定義一個(gè)異步執(zhí)行函數(shù),參數(shù)是回調(diào)函數(shù)
 */
function asyncFunc(callback) {
  setTimeout(function () {
    callback(`callback ... 執(zhí)行了 ${count} 次`);
    count++;
  }, 1000);
};

// 調(diào)用函數(shù)
asyncFunc(function (data) { // 第一次調(diào)用
  console.log(data);
  asyncFunc(function (data) { // 第二次調(diào)用
    console.log(data);
    asyncFunc(function (data) { // 第三次調(diào)用
      console.log(data);
      asyncFunc(function (data) { // 第四次調(diào)用
        console.log(data);
        asyncFunc(function (data) { // 第五次調(diào)用
          console.log(data);
          asyncFunc(function (data) { // 第六次調(diào)用
            console.log(data);
            asyncFunc(function (data) { // 第七次調(diào)用
              console.log(data);
            });
          });
        });
      });
    });
  });
});

/*************************************
callback ... 執(zhí)行了 1 次
callback ... 執(zhí)行了 2 次
callback ... 執(zhí)行了 3 次
callback ... 執(zhí)行了 4 次
callback ... 執(zhí)行了 5 次
callback ... 執(zhí)行了 6 次
callback ... 執(zhí)行了 7 次
*************************************/

看著挺好看,但是,當(dāng)回調(diào)更多的時(shí)候,如何分清是哪個(gè)回調(diào),又怎么判斷哪個(gè)括號(hào)對(duì)應(yīng)哪句代碼呢?其實(shí)這就是一個(gè)回調(diào)地獄,這樣的代碼可讀性差。

這個(gè)時(shí)候,Promise就可以發(fā)揮作用了。

看了回調(diào)函數(shù),再來(lái)看看使用Promise的情況:

"use strict";

// 定義一個(gè)計(jì)數(shù)器,用來(lái)統(tǒng)計(jì)回調(diào)函數(shù)執(zhí)行的次數(shù)
let count = 1;

/**
 * 定義一個(gè)異步執(zhí)行函數(shù),返回值是一個(gè)Promise對(duì)象
 */
function asyncFunc() {
  let promise = new Promise(function (resolve, reject) {
    setTimeout(function () {
      resolve(`resolve ... 執(zhí)行了 ${count} 次`);
      count++;
    }, 1000);
  });
  return promise;
};

// 調(diào)用函數(shù)
asyncFunc() // 第一次調(diào)用
  .then(function (data) {
    console.log(data);
    return asyncFunc(); // 第二次調(diào)用
  })
  .then(function (data) {
    console.log(data);
    return asyncFunc(); // 第三次調(diào)用
  })
  .then(function (data) {
    console.log(data);
    return asyncFunc(); // 第四次調(diào)用
  })
  .then(function (data) {
    console.log(data);
    return asyncFunc(); // 第五次調(diào)用
  })
  .then(function (data) {
    console.log(data);
    return asyncFunc(); // 第六次調(diào)用
  })
  .then(function (data) {
    console.log(data);
    return asyncFunc(); // 第七次調(diào)用
  })
  .then(function (data) {
    console.log(data);
  });
  
/*************************************
resolve ... 執(zhí)行了 1 次
resolve ... 執(zhí)行了 2 次
resolve ... 執(zhí)行了 3 次
resolve ... 執(zhí)行了 4 次
resolve ... 執(zhí)行了 5 次
resolve ... 執(zhí)行了 6 次
resolve ... 執(zhí)行了 7 次
*************************************/

會(huì)發(fā)現(xiàn),是用了Promise代碼可讀性變得很好,以后也便于修改。

用Promise包裝舊回調(diào)寫法

現(xiàn)在可以看出Promise的好處,如果想以后都使用Promise,可否實(shí)現(xiàn)?

肯定可以實(shí)現(xiàn)啊,下面就使用Promise來(lái)包裝上面的回調(diào)函數(shù)。

使用Promise包裹的時(shí)候,只需要經(jīng)過(guò)下面幾個(gè)步驟:

定義一個(gè)函數(shù),返回Promise對(duì)象

在Promise對(duì)象中調(diào)用異步執(zhí)行函數(shù),參數(shù)是創(chuàng)建Promise對(duì)象時(shí)傳遞的函數(shù)

"use strict";

// 定義一個(gè)計(jì)數(shù)器,用來(lái)統(tǒng)計(jì)回調(diào)函數(shù)執(zhí)行的次數(shù)
let count = 1;

/**
 * 定義一個(gè)異步執(zhí)行函數(shù),參數(shù)是回調(diào)函數(shù)
 */
function asyncFunc(callback) {
  setTimeout(function () {
    callback(`callback ... 執(zhí)行了 ${count} 次`);
    count++;
  }, 1000);
};

/**
 * 包裝異步執(zhí)行函數(shù),返回一個(gè)Promise對(duì)象
 */
function wrapperAsyncFunc() {
  let promise = new Promise(function (resolve, reject) {
    asyncFunc(resolve);
  });
  return promise;
};

// 調(diào)用
wrapperAsyncFunc()
  .then(function (data) {
    console.log(data);
    return wrapperAsyncFunc();
  })
  .then(function (data) {
    console.log(data);
  });
  
/*************************************
callback ... 執(zhí)行了 1 次
callback ... 執(zhí)行了 2 次
*************************************/
認(rèn)識(shí)Promise

在谷歌瀏覽器中,我們看看Promise都包含什么:

方法概述

可以看到,在Promise的prototype上有三個(gè)方法,也就是實(shí)例對(duì)象上有三個(gè)方法:

new Promise(function(resolve, reject) { ... } );
promise.then(onFulfilled[, onRejected]);
promise.catch(onRejected);

Promise對(duì)象本身的方法,就是靜態(tài)方法:

Promise.all(iterable);
Promise.race(iterable);
Promise.reject(reason);
Promise.resolve();
Promise的三種狀態(tài)

在認(rèn)識(shí)這些方法之前,先認(rèn)識(shí)一下Promise的三種狀態(tài):

pending: 初始狀態(tài),創(chuàng)建Promise成功后的狀態(tài)

fulfilled: 操作執(zhí)行成功后的狀態(tài)

rejected: 操作執(zhí)行失敗后的狀態(tài)

Promise的實(shí)例方法

首先,先來(lái)創(chuàng)建一個(gè)Promise對(duì)象,可以根據(jù)num的值,來(lái)調(diào)節(jié)執(zhí)行的函數(shù)是resolve還是reject:

new Promise(function(resolve, reject) { ... } );
"use strict";

let num = 3;

// 創(chuàng)建一個(gè)Promise對(duì)象
let promise = new Promise(function (resolve, reject) {
  if (num > 5) {
    resolve("success ..."); // 操作執(zhí)行成功執(zhí)行的函數(shù)
  } else {
    reject("failure ..."); // 操作執(zhí)行失敗執(zhí)行的函數(shù)
  }
});

首先明確一點(diǎn),Promise對(duì)象創(chuàng)建的時(shí)候,立即執(zhí)行。可是,既然是立即執(zhí)行,怎么獲取對(duì)應(yīng)的狀態(tài)值呢?下面就要使用then方法了。

promise.then(onFulfilled[, onRejected]);
promise.then(function (data) {
  console.log(data);
}, function (reason) {
  console.log(reason);
});

上面的代碼中,在then方法中需要傳遞兩個(gè)回調(diào)函數(shù),這樣看著會(huì)有點(diǎn)亂。有沒(méi)有更優(yōu)的解決方式?有,這個(gè)時(shí)候要使用catch方法。

// 把上面的代碼進(jìn)行簡(jiǎn)化
promise
  .then(function (data) { // 狀態(tài)變?yōu)閒ulfilled后執(zhí)行的回調(diào)
    console.log(data);
  }).catch(function (reason) { // 狀態(tài)變?yōu)閞ejected后執(zhí)行的回調(diào)
    console.log(reason);
  });
Promise的靜態(tài)方法

為了方法認(rèn)識(shí)Promise.all和Promise.race,定義三個(gè)Promise對(duì)象:

let promise1 = new Promise(function (resolve, reject) {
  setTimeout(function () {
    resolve("promise1 ...");
    console.log("done1 ...");
  }, 2000); // 延遲2秒
});

let promise2 = new Promise(function (resolve, reject) {
  setTimeout(function () {
    resolve("promise2 ...");
    console.log("done2 ...");
  }, 4000); // 延遲4秒
});

let promise3 = new Promise(function (resolve, reject) {
  setTimeout(function () {
    resolve("promise3 ...");
    console.log("done3 ...");
  }, 6000); // 延遲6秒
});
Promise.all

Promise.all的作用是在參數(shù)中的所有Promise對(duì)象完全執(zhí)行完成的時(shí)候,才會(huì)執(zhí)行自身的then或catch方法:

Promise
  .all([promise1, promise2, promise3])
  .then(function (data) {
    console.log(data);
  })
  .catch(function (reason) {
    console.log(reason);
  });
 
/***************************************
done1 ...
done2 ...
done3 ...
[ "promise1 ...", "promise2 ...", "promise3 ..." ]
***************************************/

Promise.all中所有的Promise對(duì)象狀態(tài)都變?yōu)閒ulfiled狀態(tài)時(shí),才會(huì)觸發(fā)then方法;其中一個(gè)變?yōu)閞ejected狀態(tài),那么就觸發(fā)catch方法。

需要注意的是,即使觸發(fā)了catch方法,其他的Promise對(duì)象中的代碼還是會(huì)正常執(zhí)行的。因?yàn)檫@是Promise的特性,創(chuàng)建之后,立即執(zhí)行。

更改一個(gè)Promise對(duì)象之后,結(jié)果就會(huì)成下面的狀態(tài):

let promise2 = new Promise(function (resolve, reject) {
  setTimeout(function () {
    reject("promise2 ...");
    console.log("done2 ...");
  }, 4000);
});

/***************************************
done1 ...
done2 ...
promise2 ...
done3 ...
***************************************/
Promise.race

Promise.race的作用是在參數(shù)中的Promise對(duì)象中的一個(gè)執(zhí)行完成的時(shí)候,就會(huì)執(zhí)行自身的then或catch方法:

Promise
  .race([promise1, promise2, promise3])
  .then(function (data) {
    console.log(data);
  })
  .catch(function (reason) {
    console.log(reason);
  });

/***************************************
done1 ...
promise1 ...
done2 ...
done3 ...
***************************************/

需要注意的是:Promise.all方法是所有的都執(zhí)行完成才會(huì)觸發(fā)then方法,就是不落下任何一個(gè)人;而Promise.race方法是有一個(gè)執(zhí)行完成就會(huì)觸發(fā)then方法,就是看誰(shuí)跑得快。

后續(xù)的兩個(gè)方法,以后用到的時(shí)候再補(bǔ)充,因?yàn)檫@些內(nèi)容對(duì)現(xiàn)在而言已經(jīng)夠用了。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/88977.html

相關(guān)文章

  • Promise——從閱讀文檔到簡(jiǎn)單實(shí)現(xiàn)(一)

    摘要:意味著操作成功完成。方法接收失敗情況的回調(diào)函數(shù)作為參數(shù),返回一個(gè)對(duì)象。參數(shù)回調(diào)函數(shù)不接收任何參數(shù),當(dāng)對(duì)象變成狀態(tài)時(shí)被調(diào)用?,F(xiàn)在各個(gè)方法的參數(shù)返回值功能和使用方法已經(jīng)有個(gè)大概的了解了,為了進(jìn)一步理解其原理,接下來(lái)我打算簡(jiǎn)單地實(shí)現(xiàn)一下它。 前言 最近幾周參加筆試面試,總是會(huì)遇到實(shí)現(xiàn)異步和處理異步的問(wèn)題,然而作者每次都無(wú)法完美地回答。在最近一次筆試因?yàn)?Promise 而被刷掉后,我終于下定...

    yanwei 評(píng)論0 收藏0
  • 關(guān)于Promise

    摘要:反之,操作失敗,對(duì)象由狀態(tài)轉(zhuǎn)換為狀態(tài),此時(shí)回調(diào)函數(shù)會(huì)執(zhí)行方法。這里需要注意的是,雖然在之后便執(zhí)行了方法,但是并不是意味著往后的對(duì)象不執(zhí)行了,其他的還是對(duì)象還是要執(zhí)行的,只是不會(huì)再調(diào)用函數(shù)。 在 掘金上看見(jiàn)一篇寫promise的文章,感覺(jué)作者寫的很棒,文章鏈接在這:八段代碼徹底掌握 Promise ??赐曛蟾杏X(jué)學(xué)到了很多,所以又重新把JavaScript Promise迷你書(中文版)...

    546669204 評(píng)論0 收藏0
  • js-Promise

    摘要:總結(jié)用方法創(chuàng)建對(duì)象用或添加對(duì)象的處理函數(shù)它的作用是為實(shí)例添加狀態(tài)改變時(shí)的回調(diào)函數(shù)。方法是的別名,用于指定發(fā)生錯(cuò)誤時(shí)的回調(diào)函數(shù)。 一、為什么需要Promise Javascript 采用回調(diào)函數(shù)(callback)來(lái)處理異步編程。從同步編程到異步回調(diào)編程有一個(gè)適應(yīng)的過(guò)程,但是如果出現(xiàn)多層回調(diào)嵌套,也就是我們常說(shuō)的回調(diào)金字塔(Pyramid of Doom),絕對(duì)是一種糟糕的編程體驗(yàn)。于是...

    xcold 評(píng)論0 收藏0
  • 簡(jiǎn)單學(xué)習(xí) Promise 對(duì)象

    摘要:方法是的別名,用于指定發(fā)生錯(cuò)誤時(shí)的回調(diào)函數(shù)。由于字符串不屬于異步操作判斷方法是字符串對(duì)象不具有方法,返回實(shí)例的狀態(tài)從一生成就是,所以回調(diào)函數(shù)會(huì)立即執(zhí)行。出錯(cuò)了等同于出錯(cuò)了出錯(cuò)了上面的代碼生成一個(gè)對(duì)象的實(shí)例,狀態(tài)為,回調(diào)函數(shù)會(huì)立即執(zhí)行。 引言 Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)和事件——更合理且強(qiáng)大。最近的項(xiàng)目要用到這個(gè),就參照阮一峰老師的《ES6標(biāo)準(zhǔn)入門...

    muzhuyu 評(píng)論0 收藏0
  • 嘗試實(shí)現(xiàn)一個(gè)Promise

    摘要:的實(shí)現(xiàn)說(shuō)明沒(méi)有執(zhí)行里的函數(shù)說(shuō)明執(zhí)行了里的函數(shù)說(shuō)明執(zhí)行里的函數(shù)過(guò)程中出現(xiàn)錯(cuò)誤和執(zhí)行狀態(tài)時(shí)的回調(diào)函數(shù)后返回的結(jié)果都需要執(zhí)行傳進(jìn)來(lái)的對(duì)象不能等于當(dāng)前的對(duì)象回調(diào)返回的值或者的值是對(duì)象時(shí)需要等待該對(duì)象的狀態(tài)變更設(shè)置當(dāng)前狀態(tài)的狀態(tài)和值執(zhí)行回調(diào)隊(duì)列里的函 function resolve_promise_value(promise,value) {//PromiseA+的實(shí)現(xiàn) var th...

    DTeam 評(píng)論0 收藏0
  • 關(guān)于promise的小結(jié)

    摘要:則是把類似的異步處理對(duì)象和處理規(guī)則進(jìn)行規(guī)范化,并按照采用統(tǒng)一的接口來(lái)編寫,而采取規(guī)定方法之外的寫法都會(huì)出錯(cuò)。這個(gè)對(duì)象有一個(gè)方法,指定回調(diào)函數(shù),用于在異步操作執(zhí)行完后執(zhí)行回調(diào)函數(shù)處理。到目前為止,已經(jīng)學(xué)習(xí)了創(chuàng)建對(duì)象和用,方法來(lái)注冊(cè)回調(diào)函數(shù)。 Promise 本文從js的異步處理出發(fā),引入Promise的概念,并且介紹Promise對(duì)象以及其API方法。 js里的異步處理 可以參考這篇文章...

    Tony_Zby 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<