国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

你必須要知道的,五個(gè)Promise高級(jí)使用技巧

開發(fā) 前端
無論是在開發(fā)中還是在面試中 promise 都是一個(gè)非常重要的內(nèi)容。常見的面試中都會(huì)問及到 promise.then()、Promise.all 或者配合 async/await 使用的方式。

無論是在開發(fā)中還是在面試中 promise 都是一個(gè)非常重要的內(nèi)容。常見的面試中都會(huì)問及到 promise.then()、Promise.all 或者配合 async/await 使用的方式。

但是,一旦我們遇到更高級(jí)別的崗位(比如大廠高P崗位),那么以上這些知識(shí)可能就不夠使用了。所以說,咱們今天就來分享 5個(gè)promise的“高級(jí)”使用技巧,提高對(duì) promise 的理解,幫大家通過高P面試!

技巧 1:Promise 順序執(zhí)行

當(dāng)面對(duì)必須順序執(zhí)行一系列任務(wù)的場景時(shí),我們第一時(shí)間都會(huì)想到 “await”。但是除了 await 之外,使用 Promise 的替代方法可能更加優(yōu)雅。

const requestAry = [() => api.request1(), () => api.request2(), () => api.request3()];
// 使用 `await`
for (const requestItem of requestAry) {
 await requestItem();
}
// 使用promise進(jìn)行串行執(zhí)行
const finallyPromise = requestAry.reduce(
 (currentPromise, nextRequest) => currentPromise.then(() => nextRequest()),
 Promise.resolve() 
);

該方法使用“then”函數(shù),可以簡潔高效地連接 Promise,確保任務(wù)的串行執(zhí)行。

技巧 2: Async/Await 的替代用法

使用 async/await 作為接收異步函數(shù)返回值的這種方式大家應(yīng)該都比較熟悉,但很少有人認(rèn)識(shí)到異步函數(shù)從根本上來說是返回一個(gè) promise。

我們來看下面這個(gè)場景

const fn1 = async () => 1;
const fn2 = () => Promise.resolve(1);
fn1(); // 返回值為1的promise對(duì)象

通常,await 與 Promise 對(duì)象一起使用,等待 promise 被解析。 因此,等待 fn1 函數(shù)也相當(dāng)于以下內(nèi)容:

await fn1();
-----
const promiseInst = fn1();
await promiseInst;

但是,對(duì)于 await 大家需要知道:當(dāng)后面的值不是 Promise 對(duì)象時(shí),它將會(huì)把該值包裝在 Promise 對(duì)象中。 因此,await之后的代碼必須異步執(zhí)行:

Promise.resolve().then(() => {
 console.log(1);
});
await 2;
console.log(2);
// 輸出: 1 2

這相當(dāng)于:

Promise.resolve().then(() => {
 console.log(1);
});
Promise.resolve().then(() => {
 console.log(2);
});

技巧 3:promise 處理連續(xù)的請(qǐng)求

當(dāng)先前的請(qǐng)求仍處于 待處理狀態(tài) 時(shí)發(fā)送重復(fù)的請(qǐng)求可能會(huì)導(dǎo)致不必要的資源消耗。

request('GET', '/test-api').then(response1 => {
 // …
});
request('GET', '/test-api').then(response2 => {
 // …
});

并且這種場景非常常見:

  • 在頁面上渲染多個(gè)內(nèi)部組件同時(shí)獲取數(shù)據(jù)時(shí)。
  • 處理提交按鈕未禁用,用戶連續(xù)點(diǎn)擊多次的場景。
  • 預(yù)加載數(shù)據(jù)時(shí),在預(yù)加載完成前導(dǎo)航至預(yù)加載頁面。

所以,我們可以對(duì) promise 進(jìn)行對(duì)應(yīng)的封裝處理,利用 緩存策略 解決這個(gè)問題,可以參考以下代碼:

// 緩存對(duì)象
const pendingPromises = {};
function request(type, url, data) {
   const requestKey = JSON.stringify([type, url, data]);
   // 讀取緩存
   if (pendingPromises[requestKey]) {
     return pendingPromises[requestKey];
   }
  const fetchPromise = fetch(url, {
     method: type,
     data: JSON.stringify(data)
  })
   .then(response => response.json())
   .finally(() => {
     delete pendingPromises[requestKey];
   });
   // 存入緩存
  return pendingPromises[requestKey] = fetchPromise;
}

技巧 4:解碼 then/catch/finally 返回值

我們知道 promise 擁有三種狀態(tài)的返回值:

.then 處理

// 返回新的 Promise(resolve => resolve(1))
Promise.resolve().then(() => 1); 
// 返回新的 Promise(resolve => resolve(Promise.resolve(2)))
Promise.resolve().then(() => Promise.resolve(2)); 
// 返回新的 Promise(resolve => resolve(Promise.reject(new Error('abc'))))
Promise.resolve().then(() => { throw new Error('abc') }); 
// 返回新的 Promise(resolve => resolve(2))
Promise.reject().then(() => 1, () => 2);

.catch 處理

// 返回新的 Promise(resolve => resolve(3))
Promise.reject().catch(() => 3); 
// 返回新的 Promise(resolve => resolve(promise object calling catch))
Promise.resolve().catch(() => 4);

.finally 處理

  • 當(dāng)finally函數(shù)返回非promise值時(shí),它會(huì)在finally函數(shù)之前返回promise對(duì)象。
// 返回 Promise.resolve()
Promise.resolve().finally(() => {}); 
// 返回 Promise.reject()
Promise.reject().finally(() => {});
  • 當(dāng)finally函數(shù)的返回值是一個(gè)promise時(shí),它會(huì)在finally函數(shù)之前等待promise解析,然后再返回promise對(duì)象。
// 返回處于 pending 狀態(tài)下的 Promise, 1秒后 resolve 為 5。
Promise.resolve(5).finally(() => new Promise(res => {
 setTimeout(res, 1000);
})); 
Promise.reject(6).finally(() => new Promise(res => {
 setTimeout(res, 1000);
})); // 返回處于 pending 狀態(tài)下的 Promise, 在1秒后 reject 為 6。

技巧 5:區(qū)分“then”的第二個(gè)回調(diào)和“catch”回調(diào)

promise 有兩種處理錯(cuò)誤的方式,分別是:

  • .then 的第二個(gè)參數(shù)回調(diào)函數(shù)
  • .catch 回調(diào)

當(dāng)請(qǐng)求出現(xiàn)錯(cuò)誤時(shí),第二個(gè)回調(diào)函數(shù)和 Promise 的 .catch 都會(huì)被觸發(fā)。

乍一看,它們好像沒什么區(qū)別,但是——前者(第二個(gè)參數(shù)回調(diào)函數(shù))無法捕獲“then”當(dāng)前第一個(gè)回調(diào)函數(shù)中拋出的錯(cuò)誤,而“catch”可以:

Promise.resolve().then(
 () => {
 throw new Error('成功的回調(diào)出現(xiàn)錯(cuò)誤');
 },
 () => {
 // 這里不會(huì)執(zhí)行
 }
).catch(reason => {
 console.log(reason.message); // 成功的回調(diào)出現(xiàn)錯(cuò)誤
});
責(zé)任編輯:華軒 來源: 程序員Sunday
相關(guān)推薦

2012-04-09 13:16:20

DIVCSS

2019-08-06 14:54:22

Hadoop數(shù)據(jù)集海量數(shù)據(jù)

2018-11-28 10:00:42

React組件前端

2021-06-07 14:04:13

并發(fā)編程Future

2024-08-27 11:55:38

2025-07-14 02:00:00

2022-09-27 14:36:57

JavaScrip數(shù)組開發(fā)

2019-02-18 13:36:03

Redis數(shù)據(jù)庫面試

2023-05-12 14:49:47

CSS框架前端

2024-08-06 14:54:16

2023-11-23 10:21:37

2020-03-27 12:30:39

python開發(fā)代碼

2011-07-13 11:03:17

ASP

2024-04-03 10:29:13

JavaScrip優(yōu)化技巧

2020-04-08 17:10:03

GitHub代碼開源

2013-03-04 09:34:48

CSSWeb

2023-01-09 17:23:14

CSS技巧

2014-01-10 13:29:44

微軟Office 365云計(jì)算

2020-11-10 08:30:58

Gartner數(shù)字化技術(shù)
點(diǎn)贊
收藏

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

免费特级黄色片| 欧美一区二区三区四区高清| 五月久久久综合一区二区小说| **欧美日韩在线观看| 最美情侣韩剧在线播放| 人妻丰满熟妇av无码区app| 日韩和欧美的一区二区| 成人国产精品一区二区| 久久久精品视频在线观看| 日韩一区二区在线免费观看| 亚洲综合偷拍欧美一区色| 久久久精品一品道一区| 国产伦精品一区二区三区视频青涩| 国产精品videossex久久发布| 国产精品17p| 久久国产精品免费一区二区三区| 日韩毛片免费观看| 日韩成人亚洲| 久久91导航| 天天色天天射天天综合网| 黄色网址在线免费观看| 操你啦在线视频| 国产色在线 com| 777电影在线观看| 欧美成人影院| 乡村艳史在线观看| 3d成人动漫在线| 91涩漫在线观看| 亚洲s色大片| 在线观看免费高清完整| 国产小视频福利在线| 中文在线中文字幕| av二区三区| 啊灬啊灬啊灬啊灬高潮在线看 | 老熟妇仑乱视频一区二区| 国产一区在线观看视频| 992tv在线成人免费观看| 亚洲欧美日韩直播| www.欧美精品| 91精品国产一区| 亚洲字幕一区二区| 日韩和欧美的一区二区| 91手机视频在线| 日本免费不卡一区二区| 国内外免费激情视频| 最近久乱中文字幕| 97超碰人人在线| 亚洲精品一线| 成人午夜影视| 免费在线你懂的| 欧美成人a交片免费看| 岛国成人av| 激情久久久久| 国产精品69毛片高清亚洲| 综合在线影院| 91亚洲一区| 蜜乳av一区二区| 国产精品第五页| 欧美日高清视频| 欧美国产第二页| 国产精品久久亚洲| 欧美一级片免费播放| 青青草视频在线免费观看| 自拍偷拍欧美视频| 国产精品成人av| 久久久久久久久久久久久久久久久久久| 中文在线a√在线8| 青青青草网站免费视频在线观看| av在线电影播放| 国产精品videossex| 一区在线免费| 久久综合久久综合亚洲| 欧美色videos| 精品国产一区二区三区久久狼黑人 | 国产亚洲精品福利| 精品欧美久久久| 97神马电影| 国产又猛又黄的视频| 欧美草逼视频| 亚洲无中文字幕| av动漫一区二区| 精品视频久久久| 欧美日韩在线精品| 电影av一区| 波多野结衣一区| 91美女片黄在线观看91美女| 日韩精品在线视频美女| 99re视频在线播放| 成年人视频免费在线播放| 三级久久三级久久久| 欧美三级电影网站| 欧美在线观看网站| 97netav| 2025韩国大尺度电影| 亚在线播放中文视频| 182tv在线播放| 一区二区三区四区五区精品视频 | 在线视频1区| 2023国产精华国产精品| 美女视频黄久久| 色婷婷av一区二区| 美女被啪啪一区二区| 欧美videosex性极品hd| 国产综合久久久久久鬼色| 在线看片第一页欧美| 黄色三级视频在线| 国产精品亚洲人成在99www| 精品免费在线视频| 欧美在线一二三区| 国产精品99精品一区二区三区∴| 久久夜色精品国产噜噜av| 2019最新中文字幕| 久久久久久久久亚洲精品| 久久国产精品99国产| 亚洲天堂开心观看| 成人午夜影院| 亚洲在线成人| 另类专区欧美制服同性| 亚洲网友自拍| 久久国产精品第一页| 久久九九精品99国产精品| 一级片a一级片| 国产日韩高清在线| 亚洲综合中文字幕在线| 九色porny自拍视频在线播放| 91色porny| 91嫩草国产在线观看| 手机看片久久| 欧美日韩美女在线| 2019日韩中文字幕mv| 日韩不卡一区| 一区二区三区视频在线| 黄污在线观看| 国产成a人亚洲精| 91精品在线观| 国产不卡精品在线| 日韩欧美一区在线| 高清孕妇孕交╳╳交| 国产福利91精品一区| 国产伦精品一区二区三毛| 亚洲精品影片| 亚洲国产精品久久久久久| 欧美精品少妇| 国产亚洲成av人在线观看导航| 欧美日韩亚洲网| 日韩免费高清在线| 一区二区三区成人精品| 国产精品999999| 精品视频在线播放一区二区三区| 欧美精品 国产精品| 国产传媒视频在线观看| 久久久国产精华| 男人的天堂成人| 午夜av在线免费观看| 亚洲一二三区不卡| 欧美日韩一区二区三区69堂| 国产在线精品一区二区三区不卡| 国产视频在线观看一区| 国产精品99久久精品| 国产91精品久久久久久久| 91精品国产自产精品男人的天堂| 在线播放国产一区二区三区| 最新国产露脸在线观看| 欧美色图一区二区三区| 国产福利电影在线| 在线观看视频91| 男人天堂av网站| 天天综合天天综合色| 亚洲s色大片在线观看| 亚洲国产你懂的| 在线一区观看| 性欧美大战久久久久久久久| 精东传媒在线观看| 午夜精品久久久久久久99樱桃| 成年在线播放小视频| 亚洲欧美国产毛片在线| 神马久久影视大全| 亚洲蜜臀av乱码久久精品| 久久午夜剧场| 色综合久久99| 国产理论在线观看| 精品福利在线导航| wwwwxxxx在线观看| 久久久久www| 国产videos久久| 国产九色精品| 国产综合成人久久大片91| 高清在线观看免费| 一区二区三区四区乱视频| 91大神xh98hx在线播放| 亚洲人成网站999久久久综合| 中文字幕成人| 91精品视频免费观看| 久久精品国产亚洲a| 午夜视频你懂的| 欧美吞精做爰啪啪高潮| av日韩电影| 国产精品狼人色视频一区| 日韩激情一二三区| 性生活免费在线观看|