日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

async await实例

發(fā)布時(shí)間:2023/12/31 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 async await实例 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

(1)await實(shí)現(xiàn)休眠效果

JavaScript 一直沒有休眠的語(yǔ)法,但是借助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語(yǔ)句后面的 Promise 對(duì)象變?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語(yǔ)句是不會(huì)執(zhí)行的,因?yàn)榈谝粋€(gè)await語(yǔ)句狀態(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語(yǔ)句是不會(huì)執(zhí)行的,因?yàn)榈谝粋€(gè)await語(yǔ)句狀態(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è)請(qǐng)求并發(fā)執(zhí)行,可以使用Promise.all和await對(duì)比

  • 使用promise.all()
async function dbFuc(db) {let docs = [{}, {}, {}];let promises = docs.map((doc) => db.post(doc));let results = await Promise.all(promises);console.log(results); }
  • 使用await
async function dbFuc(db) {let docs = [{}, {}, {}];let promises = docs.map((doc) => db.post(doc));let results = [];for (let promise of promises) {results.push(await promise);}console.log(results); }

總結(jié)

以上是生活随笔為你收集整理的async await实例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。