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

JS使用Promise時(shí)常見的5個(gè)錯(cuò)誤總結(jié)

 更新時(shí)間:2022年11月10日 10:52:05   作者:前端小智  
Promise?提供了一種優(yōu)雅的方法來(lái)處理?JS?中的異步操作。這也是避免“回調(diào)地獄”的解決方案。然而,并沒(méi)有多少開發(fā)人員了解其中的內(nèi)容。因此,許多人在實(shí)踐中往往會(huì)犯錯(cuò)誤。在本文中,介紹一下使用?promise?時(shí)的五個(gè)常見錯(cuò)誤,希望大家能夠避免

Promise 提供了一種優(yōu)雅的方法來(lái)處理 JS 中的異步操作。這也是避免“回調(diào)地獄”的解決方案。然而,并沒(méi)有多少開發(fā)人員了解其中的內(nèi)容。因此,許多人在實(shí)踐中往往會(huì)犯錯(cuò)誤。

在本文中,介紹一下使用 promise 時(shí)的五個(gè)常見錯(cuò)誤,希望大家能夠避免這些錯(cuò)誤。

1.避免 Promise 地獄

通常,Promise是用來(lái)避免回調(diào)地獄。但濫用它們也會(huì)導(dǎo)致 Promise是地獄。

userLogin('user').then(function(user){
    getArticle(user).then(function(articles){
        showArticle(articles).then(function(){
            //Your code goes here...
        });
    });
});

在上面的例子中,我們對(duì) userLogin、getararticle 和 showararticle 嵌套了三個(gè)promise。這樣復(fù)雜性將按代碼行比例增長(zhǎng),它可能變得不可讀。

為了避免這種情況,我們需要解除代碼的嵌套,從第一個(gè) then 中返回 getArticle,然后在第二個(gè) then 中處理它。

userLogin('user')
  .then(getArticle)
  .then(showArticle)
  .then(function(){
       //Your code goes here...
});

2.在 Promise 中使用 try/catch 塊

通常情況下,我們使用 try/catch 塊來(lái)處理錯(cuò)誤。然而,不建議在 Promise 對(duì)象中使用try/catch 。

這是因?yàn)槿绻腥魏五e(cuò)誤,Promise對(duì)象會(huì)在 catch 內(nèi)自動(dòng)處理。

ew Promise((resolve, reject) => {
  try {
    const data = doThis();
    // do something
    resolve();
  } catch (e) {
    reject(e);
  }
})
  .then(data => console.log(data))
  .catch(error => console.log(error));

在上面的例子中,我們?cè)赑romise 內(nèi)使用了 try/catch 塊。

但是,Promise本身會(huì)在其作用域內(nèi)捕捉所有的錯(cuò)誤(甚至是打字錯(cuò)誤),而不需要 try/catch塊。它確保在執(zhí)行過(guò)程中拋出的所有異常都被獲取并轉(zhuǎn)換為被拒絕的 Promise。

new Promise((resolve, reject) => {
  const data = doThis();
  // do something
  resolve()
})
  .then(data => console.log(data))
  .catch(error => console.log(error));

注意:在 Promise 塊中使用 .catch() 塊是至關(guān)重要的。否則,你的測(cè)試案例可能會(huì)失敗,而且應(yīng)用程序在生產(chǎn)階段可能會(huì)崩潰。

3.在 Promise 塊內(nèi)使用異步函數(shù)

Async/Await 是一種更高級(jí)的語(yǔ)法,用于處理同步代碼中的多個(gè)Promise。當(dāng)我們?cè)谝粋€(gè)函數(shù)聲明前使用 async 關(guān)鍵字時(shí),它會(huì)返回一個(gè) Promise,我們可以使用 await 關(guān)鍵字來(lái)停止代碼,直到我們正在等待的Promise解決或拒絕。

但是,當(dāng)你把一個(gè) Async 函數(shù)放在一個(gè) Promise 塊里面時(shí),會(huì)有一些副作用。

假設(shè)我們想在Promise 塊中做一個(gè)異步操作,所以使用了 async 關(guān)鍵字,但,不巧的是我們的代碼拋出了一個(gè)錯(cuò)誤。

這樣,即使使用 catch() 塊或在 try/catch 塊內(nèi)等待你的Promise,我們也不能立即處理這個(gè)錯(cuò)誤。請(qǐng)看下面的例子。

// 此代碼無(wú)法處理錯(cuò)誤
new Promise(async () => {
  throw new Error('message');
}).catch(e => console.log(e.message));

(async () => {
  try {
    await new Promise(async () => {
      throw new Error('message');
    });
  } catch (e) {
    console.log(e.message);
  }
})();

當(dāng)我在Promise塊內(nèi)遇到 async 函數(shù)時(shí),我試圖將 async 邏輯保持在 Promise 塊之外,以保持其同步性。10次中有9次都能成功。

然而,在某些情況下,可能需要一個(gè) async 函數(shù)。在這種情況下,也別無(wú)選擇,只能用try/catch 塊來(lái)手動(dòng)管理。

new Promise(async (resolve, reject) => {
  try {
    throw new Error('message');
  } catch (error) {
    reject(error);
  }
}).catch(e => console.log(e.message));


//using async/await
(async () => {
  try {
    await new Promise(async (resolve, reject) => {
      try {
        throw new Error('message');
      } catch (error) {
        reject(error);
      }
    });
  } catch (e) {
    console.log(e.message);
  }
})();

4.在創(chuàng)建 Promise 后立即執(zhí)行 Promise 塊

至于下面的代碼片斷,如果我們把代碼片斷放在調(diào)用HTTP請(qǐng)求的地方,它就會(huì)被立即執(zhí)行。

const myPromise = new Promise(resolve => {
  // code to make HTTP request
  resolve(result);
});

原因是這段代碼被包裹在一個(gè)Promise構(gòu)造函數(shù)中。然而,有些人可能會(huì)認(rèn)為只有在執(zhí)行myPromise 的then方法之后才被觸發(fā)。

然而,真相并非如此。相反,當(dāng)一個(gè)Promise被創(chuàng)建時(shí),回調(diào)被立即執(zhí)行。

這意味著在建立 myPromise 之后到達(dá)下面一行時(shí),HTTP請(qǐng)求很可能已經(jīng)在運(yùn)行,或者至少處于調(diào)度狀態(tài)。

Promises 總是急于執(zhí)行過(guò)程。

但是,如果希望以后再執(zhí)行 Promises,應(yīng)該怎么做?如果現(xiàn)在不想發(fā)出HTTP請(qǐng)求怎么辦?是否有什么神奇的機(jī)制內(nèi)置于 Promises 中,使我們能夠做到這一點(diǎn)?

答案就是使用函數(shù)。函數(shù)是一種耗時(shí)的機(jī)制。只有當(dāng)開發(fā)者明確地用 () 來(lái)調(diào)用它們時(shí),它們才會(huì)執(zhí)行。簡(jiǎn)單地定義一個(gè)函數(shù)還不能讓我們得到什么。所以,讓 Promise 變得懶惰的最有效方法是將其包裹在一個(gè)函數(shù)中!

const createMyPromise = () => new Promise(resolve => {
  // HTTP request
  resolve(result);
});

對(duì)于HTTP請(qǐng)求,Promise 構(gòu)造函數(shù)和回調(diào)函數(shù)只有在函數(shù)被執(zhí)行時(shí)才會(huì)被調(diào)用。所以現(xiàn)在我們有一個(gè)懶惰的Promise,只有在我們需要的時(shí)候才會(huì)執(zhí)行。

5.不一定使用 Promise.all() 方法

如果你已經(jīng)工作多年,應(yīng)該已經(jīng)知道我在說(shuō)什么了。如果有許多彼此不相關(guān)的 Promise,我們可以同時(shí)處理它們。

Promise 是并發(fā)的,但如你一個(gè)一個(gè)地等待它們,會(huì)太費(fèi)時(shí)間,Promise.all()可以節(jié)省很多時(shí)間。

記住,Promise.all() 是我們的朋友

const { promisify } = require('util');
const sleep = promisify(setTimeout);

async function f1() {
  await sleep(1000);
}

async function f2() {
  await sleep(2000);
}

async function f3() {
  await sleep(3000);
}


(async () => {
  console.time('sequential');
  await f1();
  await f2();
  await f3();
  console.timeEnd('sequential');  
})();

上述代碼的執(zhí)行時(shí)間約為 6 秒。但如果我們用 Promise.all() 代替它,將減少執(zhí)行時(shí)間。

(async () => {
    console.time('concurrent');
    await Promise.all([f1(), f2(), f3()]);
    console.timeEnd('concurrent'); 
  })();

總結(jié)

在這篇文章中,我們討論了使用 Promise 時(shí)常犯的五個(gè)錯(cuò)誤。然而,可能還有很多簡(jiǎn)單的問(wèn)題需要仔細(xì)解決。

到此這篇關(guān)于JS使用Promise時(shí)常見的5個(gè)錯(cuò)誤總結(jié)的文章就介紹到這了,更多相關(guān)JS Promise錯(cuò)誤內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaScript中this指向的最全總結(jié)

    JavaScript中this指向的最全總結(jié)

    前端的初學(xué)者在學(xué)習(xí)Javascript中this指向的時(shí)候經(jīng)常都會(huì)一頭霧水,尤其是在ES6箭頭函數(shù)出現(xiàn)之前,所以本篇文章主要是介紹和總結(jié)了各種情況下的this指向,希望對(duì)大家有所幫助
    2023-12-12
  • 元素的內(nèi)聯(lián)事件處理函數(shù)的特殊作用域在各瀏覽器中存在差異

    元素的內(nèi)聯(lián)事件處理函數(shù)的特殊作用域在各瀏覽器中存在差異

    在一個(gè)元素的屬性中綁定事件,實(shí)際上就創(chuàng)建了一個(gè)內(nèi)聯(lián)事件處理函數(shù)(如<h1 onclick="alert(this);"...>...</h1>),內(nèi)聯(lián)事件處理函數(shù)有其特殊的作用域鏈,并且各瀏覽器的實(shí)現(xiàn)細(xì)節(jié)也有差異。
    2011-01-01
  • js強(qiáng)制把網(wǎng)址設(shè)為默認(rèn)首頁(yè)

    js強(qiáng)制把網(wǎng)址設(shè)為默認(rèn)首頁(yè)

    有時(shí)候你會(huì)發(fā)現(xiàn)設(shè)首頁(yè)為失效,那么來(lái)一個(gè)js強(qiáng)制設(shè)置首頁(yè)的代碼,不過(guò)為了綠色上網(wǎng),盡量不要強(qiáng)迫你的用戶意志,弄不好網(wǎng)站用戶體驗(yàn)會(huì)降低。感興趣的小伙伴可以參考一下
    2015-09-09
  • JavaScript如何刪除對(duì)象的某個(gè)屬性詳析

    JavaScript如何刪除對(duì)象的某個(gè)屬性詳析

    這篇文章主要給大家介紹了關(guān)于JavaScript如何刪除對(duì)象的某個(gè)屬性的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • JavaScript數(shù)組方法-系統(tǒng)性總結(jié)詳解

    JavaScript數(shù)組方法-系統(tǒng)性總結(jié)詳解

    本文是小編給大家特意整理的關(guān)于js數(shù)組方法的知識(shí),非常實(shí)用,在面試筆試題中經(jīng)常用得到,有需要的朋友可以參考下
    2021-09-09
  • js-窮舉法 (y0h)

    js-窮舉法 (y0h)

    js-窮舉法 (y0h)...
    2006-09-09
  • js基礎(chǔ)之事件捕獲與冒泡原理

    js基礎(chǔ)之事件捕獲與冒泡原理

    這篇文章主要為大家詳細(xì)介紹了js基礎(chǔ)之事件捕獲與冒泡原理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • js判斷數(shù)組是否包含某個(gè)字符串變量的實(shí)例

    js判斷數(shù)組是否包含某個(gè)字符串變量的實(shí)例

    下面小編就為大家分享一篇js判斷數(shù)組是否包含某個(gè)字符串變量的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助
    2017-11-11
  • JS如何獲取地址欄的參數(shù)實(shí)例講解

    JS如何獲取地址欄的參數(shù)實(shí)例講解

    本篇文章給大家?guī)?lái)了關(guān)于JS如何獲取地址欄的參數(shù)實(shí)例講解,有需要的朋友們參考下。
    2018-10-10
  • JavaScript Array對(duì)象擴(kuò)展indexOf()方法

    JavaScript Array對(duì)象擴(kuò)展indexOf()方法

    JavaScript中Array對(duì)象沒(méi)有indexOf()方法,可通過(guò)下面的代碼擴(kuò)展,需要的朋友可以參考下
    2014-05-05

最新評(píng)論

仪陇县| 穆棱市| 阳山县| 千阳县| 德清县| 枝江市| 铜山县| 通辽市| 镇远县| 麻城市| 鸡西市| 延吉市| 洮南市| 石林| 尼玛县| 文登市| 苍山县| 大新县| 乡城县| 泰州市| 亳州市| 都江堰市| 九江县| 长丰县| 渝北区| 达拉特旗| 麻城市| 桑日县| 花垣县| 措美县| 新民市| 乾安县| 陇南市| 安塞县| 嘉峪关市| 安龙县| 南郑县| 宿松县| 沙雅县| 泰来县| 专栏|