精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

八個關于Promise高級用途的技巧

開發 前端
在js項目中,promise的使用應該是必不可少的,但我發現在同事和面試官中,很多中級以上的前端仍然堅持promiseInst.then()、promiseInst.catch()、Promise等常規用法等等。即使是 async/await 他們也只知道它但不知道為什么要使用它。

我發現很多人只知道如何常規地使用promise。

在js項目中,promise的使用應該是必不可少的,但我發現在同事和面試官中,很多中級以上的前端仍然堅持promiseInst.then()、promiseInst.catch()、Promise等常規用法等等。即使是 async/await 他們也只知道它但不知道為什么要使用它。

但實際上,Promise 有很多巧妙的高級用法,并且一些高級用法在 alova 請求策略庫內部也被廣泛使用。

現在,我將與大家分享8個高級使用技巧。希望這些技巧能夠對你有所幫助,現在,我們就開始吧。

1. Promise數組的串行執行

例如,如果你有一組接口需要串行執行,你可能首先想到使用await。

const requestAry = [() => api.request1(), () => api.request2(), () => api.request3()];
for (const requestItem of requestAry) {
  await requestItem();
}

如果使用promise,可以使用then函數串聯多個promise,實現串行執行。

const requestAry = [() => api.request1(), () => api.request2(), () => api.request3()];
const finallyPromise = requestAry.reduce(
     (currentPromise, nextRequest) => currentPromise.then(() => nextRequest()),
     Promise.resolve() // Create an initial promise for linking promises in the array
);

2. 在新的 Promise 范圍之外更改狀態

假設你有多個頁面,其功能要求在允許使用之前收集用戶信息。點擊使用某個功能之前,會彈出一個彈框進行信息收集。你會如何實施這個?

以下是不同級別前端同學的實現思路:

初級前端:我寫一個模態框,然后復制粘貼到其他頁面。效率非常高!

中級前端:這個不好維護。我們需要單獨封裝這個組件,并在需要的頁面引入!

高級前端:安裝任何密封的東西!!!把方法調用寫在所有頁面都可以調用的地方不是更好嗎?

想要了解高級前端是如何實現的,以vue3為例,看一下下面的例子。

<!-- App.vue -->
<template>
<!-- The following is the modal box component -->
   <div class="modal" v-show="visible">
     <div>
       User name: <input v-model="info.name" />
     </div>
     <!-- Other information -->
     <button @click="handleCancel">Cancel</button>
     <button @click="handleConfirm">Submit</button>
   </div>
   <!-- Page components -->
</template>
<script setup>
import { provide } from 'vue';
const visible = ref(false);
const info = reactive({
   name: ''
});
let resolveFn, rejectFn;
// Pass the information collection function to the following
provide('getInfoByModal', () => {
   visible.value = true;
   return new Promise((resolve, reject) => {
     // Assign the two functions to the outside and break through the promise scope
     resolveFn = resolve;
     rejectFn = reject;
   });
})
const handleConfirm = () => {
   resolveFn && resolveFn(info);
};
const handleCancel = () => {
   rejectFn && rejectFn(new Error('User has canceled'));
};
</script>

接下來,getInfoByModal就可以通過直接調用模態框來輕松獲取用戶填寫的數據。

<template>
   <button @click="handleClick">Fill in the information</button>
</template>




<script setup>
import { inject } from 'vue';
const getInfoByModal = inject('getInfoByModal');
const handleClick = async () => {
   // After the call, the modal box will be displayed. After the user clicks to confirm, the promise will be changed to the fullfilled state to obtain the user information.
   const info = await getInfoByModal();
   await api.submitInfo(info);
}
</script>

這也是很多UI組件庫中封裝常用組件的一種方式。

3. async/await 的替代用法

很多人只知道它是用來在調用await時接收async函數的返回值的,卻不知道async函數它實際上是一個返回promise的函數。例如,以下兩個函數是等效的:

const fn1 = async () => 1;
const fn2 = () => Promise.resolve(1);
fn1(); // Also returns a promise object with a value of 1

在大多數情況下,await 會跟隨 Promise 對象并等待它完全填充。因此,下面的 fn1 函數 wait 也是等價的:

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

然而,await也有一個鮮為人知的秘密。當它后面跟的值不是promise對象時,它會用promise對象包裝該值,所以await后面的代碼必須異步執行。例子:

Promise.resolve().then(() => {
  console.log(1);
});
await 2;
console.log(2);
//Print order bits: 1
Promise.resolve().then(() => {
  console.log(1);
});
Promise.resolve().then(() => {
  console.log(2);
});

4. 承諾實施請求共享

當一個請求已經發出但尚未得到響應時,再次發出相同的請求,就會造成請求的浪費。此時,我們可以將第一個請求的響應與第二個請求共享。

request('GET', '/test-api').then(response1 => {
  // ...
});
request('GET', '/test-api').then(response2 => {
  // ...
});
const pendingPromises = {};
function request(type, url, data) {
   // Use the request information as the only request key to cache the promise object being requested
   //Requests with the same key will reuse promise
   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;
}

上述兩個請求實際上只發送一次,同時收到相同的響應值。

那么,請求共享有哪些使用場景呢?我認為有以下三個:

當頁面渲染多個內部組件同時獲取數據時;
提交按鈕未禁用且用戶連續多次點擊提交按鈕;
預加載數據的情況下,預加載完成之前進入預加載頁面;

這也是alova的高級功能之一。要實現請求共享,需要使用promise的緩存功能,即一個promise對象可以通過多次await獲取數據。簡單的實現思路如下:

const promise = new Promise((resolve, reject) => {
  resolve();
  reject();
});

正確答案是已滿狀態。我們只需要記住,一旦待處理的promise從一種狀態轉移到另一種狀態,就無法更改。因此,例子中是先轉為fulfilled狀態,然后reject()就不會再轉為rejected狀態。

6.徹底明確then/catch/finally返回值

一句話概括就是,上面三個函數都會返回一個新的promise包裝對象。包裝后的值是執行回調函數的返回值。如果回調函數拋出錯誤,它將包裝拒絕狀態承諾。似乎不太容易理解,我們來看一個例子:

我們可以將它們一一復制到瀏覽器控制臺并運行它們以幫助理解。

// then function
Promise.resolve().then(() => 1); // The return value is new Promise(resolve => resolve(1))
Promise.resolve().then(() => Promise.resolve(2)); // Return new Promise(resolve => resolve(Promise.resolve(2)))
Promise.resolve().then(() => {
   throw new Error('abc')
}); // Return new Promise(resolve => resolve(Promise.reject(new Error('abc'))))
Promise.reject().then(() => 1, () => 2); // The return value is new Promise(resolve => resolve(2))


//catch function
Promise.reject().catch(() => 3); // The return value is new Promise(resolve => resolve(3))
Promise.resolve().catch(() => 4); // The return value is new Promise(resolve => resolve(promise object that calls catch))
//When the finally function returns a non-promise value, return the promise object before the finally function.
Promise.resolve().finally(() => {}); // Return Promise.resolve()
Promise.reject().finally(() => {}); // Return Promise.reject()
// When the return value of the finally function is promise, wait for the returned promise to be parsed before returning the promise object before the finally function.
Promise.resolve(5).finally(() => new Promise(res => {
   setTimeout(res, 1000);
})); // Return the Promise in pending status, which will be resolved to 5 after 1 second.
Promise.reject(6).finally(() => new Promise(res => {
   setTimeout(res, 1000);
})); // Return the Promise in the pending state, and throw the number 6 after 1 second

7、then函數的第二次回調和catch回調有什么區別?

當請求發生錯誤時,會觸發 Promise 的 then 的第二個回調函數和 catch。乍一看沒有區別,但實際上前者無法捕獲then當前第一個回調函數中拋出的錯誤,但catch可以。

Promise.resolve().then(
   () => {
     throw new Error('Error from success callback');
   },
   () => {
     // will not be executed
   }
).catch(reason => {
   console.log(reason.message); // Will print out "error from success callback"
});

原理就如上一點所說的。catch 函數是在 then 函數返回的處于拒絕狀態的 Promise 上調用的,因此它的錯誤自然可以被捕獲。

8.(最終)Promise實現koa2洋蔥中間件模型

koa2框架引入了洋蔥模型,可以讓你的請求像剝洋蔥一樣一層層進去,再一層層出來,從而實現請求前后處理的統一。

我們來看一個簡單的 koa2 洋蔥模型:

const app = new Koa();
app.use(async (ctx, next) => {
  console.log('a-start');
  await next();
  console.log('a-end');
});
app.use(async (ctx, next) => {
  console.log('b-start');
  await next();
  console.log('b-end');
});




app.listen(3000);

上面的輸出是a-start -> b-start -> b-end -> a-end,這樣神奇的輸出序列是如何實現的呢?有人沒天賦,簡單的用20行左右的代碼就實現了。如有雷同,純屬巧合。

接下來我們分析一下

注:以下內容對新手不友好,請謹慎閱讀。

首先先保存中間件函數,在listen函數中收到請求后調用洋蔥模型執行。

function action(koaInstance, ctx) {
  // ...
}




class Koa {
   middlewares = [];
   use(mid) {
     this.middlewares.push(mid);
   }
   listen(port) {
     // Pseudocode simulates receiving request
     http.on('request', ctx => {
       action(this, ctx);
     });
   }
}

收到請求后,從第一個中間件開始串行執行next之前的前置邏輯。

//Start to start middleware call
function action(koaInstance, ctx) {
   let nextMiddlewareIndex = 1; // Identifies the next middleware index to be executed
   //Define next function
   function next() {
     // Before peeling the onion, calling next will call the next middleware function
     const nextMiddleware = middlewares[nextMiddlewareIndex];
     if (nextMiddleware) {
       nextMiddlewareIndex++;
       nextMiddleware(ctx, next);
     }
   }
   //Start execution from the first middleware function and pass in the ctx and next functions
   middlewares[0](ctx, next);
}

處理next之后的post邏輯

function action(koaInstance, ctx) {
   let nextMiddlewareIndex = 1;
   function next() {
     const nextMiddleware = middlewares[nextMiddlewareIndex];
     if (nextMiddleware) {
       nextMiddlewareIndex++;
       // A return is also added here to allow the execution of the middleware function to be executed in series from back to front using promises (it is recommended to understand this return repeatedly)
       return Promise.resolve(nextMiddleware(ctx, next));
     } else {
       // When the pre-logic of the last middleware is executed, return the fullyfilled promise and start executing the post-logic after next.
       return Promise.resolve();
     }
   }
   middlewares[0](ctx, next);
}

至此,一個簡單的洋蔥模型就已經實現了。

責任編輯:華軒 來源: web前端開發
相關推薦

2024-03-06 13:56:00

項目awaitpromise

2024-01-02 16:16:34

Promise前端

2024-07-02 09:03:48

2025-02-10 10:38:24

2012-10-29 11:01:17

2022-12-15 16:38:17

2023-10-24 09:25:23

IT技巧文化

2025-01-02 15:08:36

SpringBoot自動配置Java

2022-05-30 00:04:16

開源Github技巧

2010-08-25 11:14:05

云安全數據安全網絡安全

2024-03-21 09:58:27

ExtractTypeScript工具類型

2021-01-11 08:30:02

Dubbo服務

2024-04-01 07:51:49

Exclude?工具類型TypeScript

2023-01-03 11:47:47

2023-06-27 09:21:33

2025-05-09 09:26:12

2023-02-22 14:50:59

技術AI

2010-09-09 13:44:06

DIVCSS

2011-09-25 10:46:18

云計算安全

2010-08-11 16:43:05

職場
點贊
收藏

51CTO技術棧公眾號

精品中文字幕在线播放 | 一本色道久久综合精品婷婷| av在线不卡免费观看| 欧美精品久久久久久久久老牛影院| 亚洲在线不卡| 天堂在线观看视频| 另类人妖一区二区av| 欧美精品videosex牲欧美| 一区二区三区免费在线观看视频| 日韩三级一区| 精品国产老师黑色丝袜高跟鞋| 免费h精品视频在线播放| 国产又粗又猛又爽又黄的| 午夜国产欧美理论在线播放| 亚洲午夜久久久影院| 日韩高清一二三区| 福利一区视频| 黑人巨大精品欧美一区二区| 日本黄色播放器| 久草在线青青草| 成人在线视频一区二区| 国产日本欧美一区二区三区在线 | 精品福利av| 中文日韩在线视频| 搡老熟女老女人一区二区| 国产精品1区在线| 欧美在线观看18| ww国产内射精品后入国产| 黄色网页网址在线免费| 国产午夜精品久久久久久免费视| 国产精品成人观看视频免费| 国产精品国产一区二区三区四区| 午夜亚洲性色视频| 久久久久久久激情视频| 男人与禽猛交狂配| 97精品国产福利一区二区三区| 亚洲色图校园春色| 人妻丰满熟妇av无码久久洗澡 | 日产精品久久久一区二区| 少妇荡乳情欲办公室456视频| 国产精品综合一区二区| 国产日产久久高清欧美一区| 小泽玛利亚一区二区三区视频| 亚洲欧美成人| 性视频1819p久久| 日韩av电影网址| 亚洲天堂久久| 韩国精品美女www爽爽爽视频| 欧美成人精品一区二区免费看片 | 亚洲第一天堂网| 国产美女精品人人做人人爽| 成人精品网站在线观看| 国产精品视频一区二区三区,| 久久久人人人| 国产99在线|中文| 精品无码一区二区三区的天堂| 亚洲少妇一区| 欧美在线视频网| 99精品人妻国产毛片| 久久先锋影音| 国产精品久久视频| 中文字幕在线2019| 久久成人av少妇免费| 91精品视频在线看| 亚洲国产成人在线观看| av在线一区二区三区| 精品久久久久久乱码天堂| 午夜成人免费影院| 久久精品人人做人人综合| 日本免费高清一区二区| 日本中文在线| 一区二区视频在线| 久久成人免费观看| gogo亚洲高清大胆美女人体 | 丁香花免费高清完整在线播放| 成人午夜视频网站| 欧美xxxx黑人又粗又长密月 | 亚洲aaa级| 亚洲新中文字幕| 亚洲av无码一区二区三区在线| 国内成人在线| 国产成人亚洲综合91精品| 亚洲天堂中文字幕在线| 国产盗摄精品一区二区三区在线 | 中文字幕久久久久久久| 黄色网一区二区| 在线日韩第一页| 欧美黄片一区二区三区| 亚洲一区二区伦理| 国产一区玩具在线观看| 蜜桃视频在线观看www| 久久先锋资源网| 成人性做爰片免费视频| 欧美男人天堂| 91精品国产一区二区人妖| 日本一卡二卡在线| 色狮一区二区三区四区视频| 久久久久成人精品| 在线免费观看av片| 成人美女视频在线看| 亚洲精品欧美精品| 超碰公开在线| 欧洲激情一区二区| 老司机午夜免费福利| 波多野结衣在线观看一区二区| 欧美激情国内偷拍| 人人妻人人爽人人澡人人精品| 国产精品影视在线观看| 偷拍视频一区二区| 亚洲十八**毛片| 欧美高清视频在线高清观看mv色露露十八| 日本一区二区在线免费观看| 影音先锋成人在线电影| 国产成人精品日本亚洲| 免费观看a视频| 亚洲私人黄色宅男| 亚洲精品一二三四五区| eeuss鲁片一区二区三区| 日韩中文字幕国产| 福利一区二区三区四区| 狠狠久久亚洲欧美| 日韩在线电影一区| 麻豆福利在线观看| 日韩欧美专区在线| chinese全程对白| 青草国产精品久久久久久| 精品欧美一区二区在线观看视频| 三级资源在线| 日韩三级电影网址| 国产天堂av在线| 久久www免费人成看片高清| 六月婷婷久久| 英国三级经典在线观看| 亚洲国产私拍精品国模在线观看| 免看一级a毛片一片成人不卡| 久久精品国产99| 亚洲黄色成人久久久| 欧美freesex| 亚洲精品在线视频| 久久久久久久久久影院| 99视频精品在线| 久久久亚洲精品无码| 国产精品chinese在线观看| 欧美黑人xxxx| 国产18精品乱码免费看| 夜夜揉揉日日人人青青一国产精品| 羞羞的视频在线| 97精品视频| 成人免费网站在线| av片在线观看永久免费| 日韩亚洲欧美一区| 免费三级在线观看| 国产高清亚洲一区| 美女黄色免费看| 久久a爱视频| 欧美在线欧美在线| 国产玉足榨精视频在线观看| 欧美自拍偷拍一区| 五月天色婷婷丁香| 国产成人亚洲精品青草天美| 日韩国产一级片| 亚洲第一二三区| 国产剧情久久久久久| jizz性欧美| 精品av久久707| 综合网在线观看| 一区免费观看视频| 亚洲国产日韩在线一区| 亚洲国产精品第一区二区| 狠狠久久综合婷婷不卡| gogo亚洲高清大胆美女人体| 中文字幕在线日韩| 亚洲国产精品无码久久| 精品露脸国产偷人在视频| 国产熟妇久久777777| 久久av老司机精品网站导航| 国产a级黄色大片| 欧美人妖视频| 国产欧美日韩精品专区| 亚洲丝袜精品| 亚洲欧美中文日韩在线v日本| 国内av在线播放| 一区二区三区免费网站| aa一级黄色片| 国产在线不卡一区| 欧美三级一级片| 91精品动漫在线观看| 国产一区二区三区四区hd| 影音成人av| 欧美激情视频给我| gogogo高清在线观看免费完整版| 欧美一区日韩一区| 无码人妻精品一区二区三区9厂 | 欧美久久亚洲| 日本91av在线播放| av在线播放国产| 亚洲色图在线观看| 黑人操亚洲女人| 欧美日本在线看| 日韩黄色一级大片| 最新国产の精品合集bt伙计| 强迫凌虐淫辱の牝奴在线观看| 精品在线视频一区| 男人天堂网视频| 欧美日本一区二区高清播放视频| 日本午夜精品一区二区| 视频在线观看免费影院欧美meiju 视频一区中文字幕精品 | 91网站免费入口| 国产不卡视频在线观看| 香港日本韩国三级网站| 久久aⅴ国产紧身牛仔裤| av片在线免费| 亚洲欧美色图| 午夜精品美女久久久久av福利| 国产精品qvod| 91一区二区三区| 欧美男女视频| 国产精国产精品| 美女的胸无遮挡在线观看| 欧美成人亚洲成人| 免费av网站在线看| 伊人久久大香线蕉av一区二区| 午夜在线视频观看| 精品捆绑美女sm三区| 国产肥老妇视频| 欧美久久久久久久久中文字幕| 天天干天天插天天射| 欧美日韩国产精品专区| 亚洲国产精品成人无久久精品| 中文字幕一区二区三区不卡 | 日本a口亚洲| 欧美精品免费观看二区| 欧美性生活一级片| 国产一区在线免费观看| 国偷自产av一区二区三区| 成人av资源网| 成人性生交大片免费看中文视频| 2014亚洲精品| 日韩精品视频一区二区三区| 91免费福利视频| 日韩高清一区| 国产不卡一区二区三区在线观看| 麻豆视频久久| 99r国产精品视频| 国产图片一区| 狠狠色综合一区二区| 神马久久av| 欧美福利一区二区三区| 蜜乳av综合| 亚洲精美视频| 伊人久久大香线蕉精品组织观看| 久久久久久久久网| 国产精品二区影院| 2018中文字幕第一页| av成人天堂| 毛片av免费在线观看| 日韩av一级片| 欧美视频国产视频| 国产成人99久久亚洲综合精品| 欧洲熟妇的性久久久久久| 播五月开心婷婷综合| 黄色正能量网站| 国产女主播视频一区二区| 91无套直看片红桃在线观看| 亚洲婷婷国产精品电影人久久| 欧美黄色一级网站| 狠狠躁夜夜躁人人爽天天天天97| 亚洲av无码精品一区二区| 精品视频资源站| 亚洲精品xxxx| 手机在线视频一区| 国产在线精品一区二区夜色 | 欧美大片免费| 国产免费成人av| 最新精品在线| 麻豆精品蜜桃一区二区三区| 国产一区二区三区91| 亚洲在线色站| 亚洲深夜福利| 三上悠亚av一区二区三区| 国产电影精品久久禁18| v8888av| 中文字幕一区二区在线观看| 香蕉视频一区二区| 欧美日韩一级二级| 亚洲成人中文字幕在线| 国产亚洲激情在线| 男女羞羞视频在线观看| 国产福利精品视频| 亚洲国产aⅴ精品一区二区| 欧美日韩精品久久| 综合视频在线| 日韩中文字幕组| 国产成人av自拍| 中文字幕第二区| 香蕉成人啪国产精品视频综合网| 一级片在线免费播放| 精品日韩一区二区三区| av电影在线观看| 91精品国产自产91精品| 国产95亚洲| 日韩中文一区二区三区| 亚洲国产片色| 亚洲精品国产一区二区三区| 久久久久久久综合狠狠综合| 久草国产在线视频| 欧美高清性hdvideosex| 激情综合闲人网| 久久久久久久影院| 99久热在线精品视频观看| 日本一区高清不卡| 99在线精品视频在线观看| 国内自拍第二页| 国产精品婷婷午夜在线观看| 国产又黄又爽又色| 精品三级在线观看| av香蕉成人| 国产精品丝袜高跟| 国产真实有声精品录音| 久激情内射婷内射蜜桃| 国产一区二区在线视频| www.黄色com| 欧美亚洲动漫制服丝袜| 青青操视频在线| 欧美亚洲国产视频小说| 加勒比色综合久久久久久久久| 手机看片日韩国产| 另类调教123区| 色噜噜噜噜噜噜| 欧美性生交片4| 国产高清视频在线| 国产成人av在线| 精品日本12videosex| 国产精品后入内射日本在线观看| 粉嫩av一区二区三区在线播放| 亚洲精品卡一卡二| 欧美精品久久天天躁| 免费黄网站在线播放| 国产精品美女www| 日韩精品dvd| 天天干天天av| 亚洲欧美aⅴ...| 国产深喉视频一区二区| 欧美大成色www永久网站婷| 国产亚洲高清在线观看| 免费cad大片在线观看| 国产精品996| 国产精品白浆一区二小说| 亚洲成色777777女色窝| 国产后进白嫩翘臀在线观看视频| 国产精品高清一区二区三区| 国产精品啊啊啊| www.88av| 日韩欧美a级成人黄色| 久青青在线观看视频国产| 国产精品国产三级国产aⅴ浪潮| 国产影视一区| 日韩肉感妇bbwbbwbbw| 中文字幕一区免费在线观看| 国产女人高潮的av毛片| 欧美极度另类性三渗透| 欧美爱爱网站| 粗暴91大变态调教| 国产精品毛片大码女人| av综合在线观看| 91av成人在线| 精品欧美久久| 日批视频在线看| 欧美日韩免费在线观看| 国产黄色片在线播放| 91丨九色丨国产在线| 在线成人h网| 91激情视频在线观看| 538在线一区二区精品国产| 九色91在线| 欧美日韩三区四区| 国产一区美女在线| 国产午夜在线播放| 色噜噜久久综合伊人一本| 欧美区一区二区| 欧美色图色综合| 中文字幕在线一区| 日韩一级在线播放| 国产精品入口日韩视频大尺度 | 国产日本欧美一区二区| 97超视频在线观看| 97在线观看免费| 午夜av一区| 大地资源二中文在线影视观看| 欧美精选午夜久久久乱码6080| segui88久久综合9999| 四虎影院一区二区三区 | 欧美一区二区三区四区视频| 日本三级一区| 欧美xxxx吸乳| 久久精品网站免费观看| 免费观看成年人视频| 成人妇女淫片aaaa视频| 久久精品女人| 国产无套在线观看|