成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JavaScript Promise 高級(jí)技巧:避免常見(jiàn)陷阱與解決方案

開(kāi)發(fā) 前端
雖然 async/await 能解決許多 Promise 問(wèn)題,但深入理解 Promise 機(jī)制至關(guān)重要。掌握這些陷阱及其解決方案,將幫助您編寫(xiě)更健壯的異步代碼。

我曾在前文中介紹過(guò) JavaScript Promise 的基礎(chǔ)知識(shí) 以及 如何使用 async/await 關(guān)鍵字 來(lái)簡(jiǎn)化異步代碼。本文將深入探討 JavaScript Promise 的高級(jí)應(yīng)用,分析開(kāi)發(fā)者常遇到的四個(gè)陷阱及其解決方案。

陷阱一:Promise 處理器總是返回 Promise

無(wú)論是 then 還是 catch 處理器,只要返回值,該值就會(huì)被自動(dòng)包裝成 Promise(如果它本身不是 Promise)。因此,永遠(yuǎn)不需要這樣寫(xiě)代碼:

firstAjaxCall.then(() => {
  return new Promise((resolve, reject) => {
    nextAjaxCall().then(() => resolve());
  });
});

由于 nextAjaxCall 本身返回 Promise,可以簡(jiǎn)化為:

firstAjaxCall.then(() => {
  return nextAjaxCall();
});

對(duì)于普通值(非 Promise),處理器會(huì)將其包裝為已解析的 Promise,因此可以繼續(xù)鏈?zhǔn)秸{(diào)用:

firstAjaxCall.then((response) => {
  return response.importantField
}).then((resolvedValue) => {
  // resolvedValue 就是上面返回的 response.importantField
  console.log(resolvedValue);
});

解決方案一:使用 Promise.resolve() 處理不確定值

當(dāng)不確定輸入值是否為 Promise 時(shí),可以使用靜態(tài)方法 Promise.resolve()。該方法會(huì)自動(dòng)處理兩種情況:

let processInput = (maybePromise) => {
  let definitelyPromise = Promise.resolve(maybePromise);
  definitelyPromise.then(doSomeWork);
};

陷阱二:.then() 只接受函數(shù)參數(shù)

常見(jiàn)錯(cuò)誤寫(xiě)法:

let getAllArticles = () => someAjax.get('/articles');
let getArticleById = (id) => someAjax.get(`/articles/${id}`);

getAllArticles().then(getArticleById(2));

本意是先獲取所有文章,再獲取 ID 為 2 的文章,但實(shí)際上兩個(gè)請(qǐng)求會(huì)同時(shí)發(fā)起。問(wèn)題在于 JavaScript 會(huì)立即執(zhí)行 getArticleById(2),而不是將其作為函數(shù)傳遞。

解決方案一:使用箭頭函數(shù)包裝

getAllArticles().then(() => getArticleById(2));

解決方案二:傳遞命名函數(shù)引用

let getArticle2 = () => getArticleById(2);
getAllArticles().then(getArticle2);

解決方案三:使用 async/await

async function getSequentially() {
  const allArticles = await getAllArticles();
  const specificArticle = await getArticleById(2);
  // 使用 specificArticle
}

陷阱三:非函數(shù)參數(shù)導(dǎo)致的意外行為

錯(cuò)誤示例:

getAllArticles().then(getArticleById(2)).then((article2) => {
  // article2 實(shí)際上是 getAllArticles() 的解析值
});

由于第一個(gè) .then() 接收的是立即執(zhí)行結(jié)果而非函數(shù),會(huì)導(dǎo)致后續(xù)處理器獲取到錯(cuò)誤的值。

解決方案一:使用帶形參的命名函數(shù)

let extractId = (article) => article.id;
getFirstArticle().then(extractId).then(getCommentsForArticleId);

解決方案二:使用 async/await

async function getArticleAndComments() {
  const article = await getFirstArticle();
  const comments = await getCommentsForArticleId(article.id);
  // 使用 comments
}

陷阱四:async/await 破壞并發(fā)性

錯(cuò)誤示例(順序執(zhí)行):

async function getMultipleUsersSequentially(userIds) {
  const users = [];
  for (const id of userIds) {
    const user = await fetchUserDataPromise(id); // 每次等待
    users.push(user);
  }
  return users;
}
// 三個(gè)請(qǐng)求需要約 4.5 秒(每個(gè) 1.5 秒)

解決方案:使用 Promise.all 實(shí)現(xiàn)并發(fā)

async function getMultipleUsersConcurrently(userIds) {
  const promises = userIds.map(id => fetchUserDataPromise(id));
  const users = await Promise.all(promises);
  return users;
}
// 三個(gè)并發(fā)請(qǐng)求只需約 1.5 秒

總結(jié)

雖然 async/await 能解決許多 Promise 問(wèn)題,但深入理解 Promise 機(jī)制至關(guān)重要。掌握這些陷阱及其解決方案,將幫助您編寫(xiě)更健壯的異步代碼。

原文地址:https://www.infoworld.com/article/3999603/javascript-promises-4-gotchas-and-how-to-avoid-them.html

責(zé)任編輯:武曉燕 來(lái)源: 前端小石匠
相關(guān)推薦

2016-09-06 12:05:23

SaaSSaaS平臺(tái)SaaS服務(wù)

2024-04-10 08:24:29

2024-08-22 18:56:34

2024-11-08 13:47:35

中文亂碼配置

2024-10-14 08:29:14

異步編程任務(wù)

2017-02-15 09:40:38

JavaScript分析解決

2020-09-09 10:00:41

JavaScript前端瓶頸

2010-05-12 14:18:58

Linux引導(dǎo)

2019-10-08 16:05:19

Redis數(shù)據(jù)庫(kù)系統(tǒng)

2009-11-18 16:10:00

2023-05-06 15:32:04

2010-08-11 15:17:51

瀏覽器兼容性問(wèn)題

2018-11-18 16:31:14

Kubernetes監(jiān)控容器

2021-02-28 13:19:42

大數(shù)據(jù)IT數(shù)據(jù)管理

2014-01-07 13:54:02

HadoopYARN

2009-06-10 22:13:55

JavaScriptExcel打印

2024-05-09 15:00:38

Python編碼開(kāi)發(fā)

2010-10-08 13:27:51

IE6pngJavaScript

2018-08-02 15:09:20

PyTorch深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)

2024-08-28 08:54:54

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 美女视频久久 | 精品少妇一区二区三区日产乱码 | 国产在线视频在线观看 | 日本在线小视频 | 男女污网站 | 久久精品电影 | 日本高清aⅴ毛片免费 | 一级免费毛片 | 欧美精品久久久久 | 国产精品99久久久久久宅男 | 欧美在线观看一区二区 | 一区中文字幕 | 国产亚洲精品美女久久久久久久久久 | 激情a| 一级爱爱片 | 欧美日韩精品一区二区 | 午夜精品一区二区三区在线视频 | 国产高清在线精品 | 另类专区亚洲 | 99精品国产一区二区三区 | 一区二区在线免费观看 | 一级毛片免费视频观看 | 在线不卡视频 | 99久久精品免费看国产四区 | a级毛片国产 | 97国产精品| 天堂综合网 | 激情网站在线观看 | 四虎最新地址 | www狠狠爱com| 国产一级片久久久 | 日韩欧美一区在线 | 99re视频在线观看 | 狠狠干综合视频 | 99久久精品视频免费 | 成人视屏在线观看 | 一级一片在线观看 | 欧美另类视频 | 国产探花在线精品一区二区 | 一区二区三区欧美 | 国产欧美日韩 |