Vue?中?Promise?的then方法異步使用及async/await?異步使用總結(jié)
1.Promise 的 then 方法使用
then 方法是 Promise 中 處理的是異步調(diào)用,異步調(diào)用是非阻塞式的,在調(diào)用的時候并不知道它什么時候結(jié)束,也就不會等到他返回一個有效數(shù)據(jù)之后再進(jìn)行下一步處理;
想了解 Promise 的使用,可以看這篇文章: ES6 中 Promise對象使用學(xué)習(xí)
使用示例:
new Promise(function (resolve, reject) { resolve(1); }).then(console.log); console.log(2); // 2 // 1
Promise 的回調(diào)函數(shù)屬于異步任務(wù),會在同步任務(wù)之后執(zhí)行。上面代碼會先輸出2,再輸出1。因為console.log(2)是同步任務(wù),而then的回調(diào)函數(shù)屬于異步任務(wù),一定晚于同步任務(wù)執(zhí)行?! ?/strong>
但是,Promise 的回調(diào)函數(shù)不是正常的異步任務(wù),而是微任務(wù)(microtask)。它們的區(qū)別在于,正常任務(wù)追加到下一輪事件循環(huán),微任務(wù)追加到本輪事件循環(huán)。這意味著,微任務(wù)的執(zhí)行時間一定早于正常任務(wù)。
setTimeout(function() { console.log(1); }, 0); new Promise(function (resolve, reject) { resolve(2); }).then(console.log); console.log(3); // 3 // 2 // 1
上面代碼的輸出結(jié)果是321
。這說明then
的回調(diào)函數(shù)的執(zhí)行時間,早于setTimeout(fn, 0)
。因為then
是本輪事件循環(huán)執(zhí)行,setTimeout(fn, 0)
在下一輪事件循環(huán)開始時執(zhí)行。
所以在 使用Promise 的then方法時,一定要考慮 業(yè)務(wù)的處理邏輯,是否需要串行執(zhí)行,如果需要串行執(zhí)行,就要避免 后續(xù)的任務(wù) 早于 異步的任務(wù)執(zhí)行結(jié)束
2. async await 使用
使用 async 與 await 可以解決多個異步任務(wù)執(zhí)行時的串行執(zhí)行,也可以解決 Promise 使用 then 方法 異步執(zhí)行的流程控制
可以使用 async 和 await來得到我們的返回值
async關(guān)鍵詞用于函數(shù)上(async函數(shù)的返回值是Promise實例對象)
await關(guān)鍵子用于async函數(shù)當(dāng)中(await可以得到異步的結(jié)果)
Promise構(gòu)造函數(shù)的參數(shù)是一個函數(shù),函數(shù)里面的代碼是異步的,即Promise里面的操作,和Promise()外面的操作時異步"同時"進(jìn)行的。此外,只要在函數(shù)前面加上async 關(guān)鍵字,也可以指明函數(shù)是異步的。
async關(guān)鍵字實際是通過Promise實現(xiàn),如果async 函數(shù)中有返回一個值 ,當(dāng)調(diào)用該函數(shù)時,內(nèi)部會調(diào)用Promise.solve() 方法把它轉(zhuǎn)化成一個promise 對象作為返回,但如果timeout 函數(shù)內(nèi)部拋出錯誤,那么就會調(diào)用Promise.reject() 返回一個promise 對象。若某函數(shù)調(diào)用一個異步函數(shù)(比如內(nèi)部含有primise),該函數(shù)應(yīng)用async修飾。
await表示“等待”,修飾返回promise 對象的表達(dá)式。注意await 關(guān)鍵字只能放到async 函數(shù)里面。
//寫一個async 函數(shù),從而可以使用await 關(guān)鍵字, await 后面放置的就是返回promise對象的一個表達(dá)式 async getUserList(){ const {data: res} = await this.$http.get('users', { params: this.queryInfo }) //console.log(res) if (res.meta.status !== 200) return this.$message.error('獲取用戶列表失敗! ') this.userlist = res.data.users this.total = res.data.total }
3. async/await處理多個異步請求
第一個異步請求的結(jié)果
可以作為第二個異步請求內(nèi)部的參數(shù),進(jìn)行判斷等數(shù)據(jù)操作。
形成鏈?zhǔn)疥P(guān)系
示例:
function getSomething() { return "something"; } async function testAsync() { return Promise.resolve("hello async"); } async function test() { const v1 = await getSomething(); const v2 = await testAsync(); console.log(v1, v2); } test();
執(zhí)行的結(jié)果如圖所示:
這種寫法可以保證的執(zhí)行順序;
到此這篇關(guān)于Vue 中 Promise 的then方法異步使用及async/await 異步使用總結(jié)的文章就介紹到這了,更多相關(guān)Promise 的 then 方法使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue3+vuedraggable實現(xiàn)動態(tài)配置頁面
這篇文章主要為大家詳細(xì)介紹了Vue3如何利用vuedraggable實現(xiàn)動態(tài)配置頁面,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,需要的可以參考一下2023-12-12vue2如何使用face-api.js實現(xiàn)人臉識別功能
本文介紹了如何在Vue.js項目中利用face-api.js實現(xiàn)人臉識別功能,首先需要安裝Vue.js和face-api.js以及其依賴TensorFlow.js,接著,下載并配置必要的模型文件到項目目錄,之后,將人臉識別功能封裝成Vue組件,并在組件中通過視頻流進(jìn)行人臉檢測和結(jié)果展示2024-09-09