async await实例
(1)await實(shí)現(xiàn)休眠效果
JavaScript 一直沒有休眠的語法,但是借助await命令就可以讓程序 停頓指定的時(shí)間 。
function sleep(interval) {return new Promise(resolve => {setTimeout(resolve, interval);}) }// 用法 async function one2FiveInAsync() {for(let i = 1; i <= 5; i++) {console.log(i);await sleep(1000);} }one2FiveInAsync();(2)一個(gè)異步操作失敗,也不要中斷后面的異步操作
任何一個(gè)await語句后面的 Promise 對象變?yōu)閞eject狀態(tài),那么整個(gè)async函數(shù)都會(huì)中斷執(zhí)行。
async function f() {await Promise.reject('出錯(cuò)了');await Promise.resolve('hello world'); // 不會(huì)執(zhí)行 }上面代碼中,第二個(gè)await語句是不會(huì)執(zhí)行的,因?yàn)榈谝粋€(gè)await語句狀態(tài)變成了reject。
如果我們希望即使前一個(gè)異步操作失敗,也不要中斷后面的異步操作? 這時(shí)可以將第一個(gè)await放在try…catch結(jié)構(gòu)里面,這樣不管這個(gè)異步操作是否成功,第二個(gè)await都會(huì)執(zhí)行。
async function f() {try {await Promise.reject('出錯(cuò)了');} catch(e) {}`在這里插入代碼片`return await Promise.resolve('hello world'); }f() .then(v => console.log(v)) // hello world上面代碼中,第二個(gè)await語句是不會(huì)執(zhí)行的,因?yàn)榈谝粋€(gè)await語句狀態(tài)變成了reject。
async function f() {await Promise.reject('出錯(cuò)了').catch(e => console.log(e));return await Promise.resolve('hello world'); }f() .then(v => console.log(v)) // 出錯(cuò)了 // hello world如果有多個(gè)await命令,可以統(tǒng)一放在try…catch結(jié)構(gòu)中
async function main() {try {const val1 = await firstStep();const val2 = await secondStep(val1);const val3 = await thirdStep(val1, val2);console.log('Final: ', val3);}catch (err) {console.error(err);} }(3)多次重復(fù)嘗試操作
try…catch結(jié)構(gòu),實(shí)現(xiàn) 多次重復(fù)操作。
const superagent = require('superagent'); const NUM_RETRIES = 3;async function test() {let i;for (i = 0; i < NUM_RETRIES; ++i) {try {await superagent.get('http://google.com/this-throws-an-error');break;} catch(err) {}}console.log(i); // 3 }test();(4) 多個(gè)await命令后面的異步操作,如果不存在繼發(fā)關(guān)系,最好讓它們同時(shí)觸發(fā)
1.錯(cuò)誤寫法:
let foo = await getFoo(); let bar = await getBar();上面代碼中,getFoo和getBar是兩個(gè)獨(dú)立的異步操作(即互不依賴),被寫成繼發(fā)關(guān)系。這樣比較耗時(shí),因?yàn)橹挥術(shù)etFoo完成以后,才會(huì)執(zhí)行g(shù)etBar,完全可以讓它們同時(shí)觸發(fā)。
2.正確寫法:
// 寫法一 let [foo, bar] = await Promise.all([getFoo(), getBar()]);// 寫法二 let fooPromise = getFoo(); let barPromise = getBar(); let foo = await fooPromise; let bar = await barPromise;上面兩種寫法,getFoo和getBar都是同時(shí)觸發(fā),這樣就會(huì)縮短程序的執(zhí)行時(shí)間
(5) 希望多個(gè)請求并發(fā)執(zhí)行,可以使用Promise.all和await對比
- 使用promise.all()
- 使用await
總結(jié)
以上是生活随笔為你收集整理的async await实例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win11 23H2 开始菜单新功能 —
- 下一篇: 智能电视盒子处理器怎么选择的 电视盒子C