国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

詳解node Async/Await 更好的異步編程解決方案

2024-05-06 15:34:25
字體:
來源:轉載
供稿:網友

一、異步編程的終極解決方案

前幾天寫過關于 javascript 異步操作的文章《Javascript Promise 詳解》. 最近在學習 Puppeteer 的時候又發現另一種異步編程解決方案:Async/Await.

異步操作是 JavaScript 編程的麻煩事,麻煩到一直有人提出各種各樣的方案,試圖解決這個問題。 從最早的回調函數,到 Promise 對象,再到 Generator 函數,每次都有所改進,但又讓人覺得不徹底。 它們都有額外的復雜性,都需要理解抽象的底層運行機制。

在 Async 函數出來之后,有人認為它是異步編程的最終解決方案。因為有了 Async/Await 之后,你根本就不用關心是它是不是異步編程。

二、基本用法

async 函數返回一個 Promise 對象,可以使用 then 方法添加回調函數。 當函數執行的時候,一旦遇到 await 就會先返回,等到觸發的異步操作完成,再接著執行函數體內后面的語句。

下面是一個栗子:

var sleep = function (time) {  return new Promise(function (resolve, reject) {    setTimeout(function () {      resolve();    }, time);  })};var start = async function () {  // 在這里使用起來就像同步代碼那樣直觀  console.log('start');  await sleep(3000);  console.log('end');};start();

執行上面的代碼,你會發現,控制臺先輸出start,稍等3秒后,輸出了end。

三、注意事項

1、await 命令只能用在 async 函數之中,如果用在普通函數,就會報錯。

async function dbFuc(db) { let docs = [{}, {}, {}]; // 報錯 docs.forEach(function (doc) {  await db.post(doc); });}

2、await 表示在這里等待promise返回結果了,再繼續執行。

var sleep = function (time) {  return new Promise(function (resolve, reject) {    setTimeout(function () {      // 返回 ‘ok'      resolve('ok');    }, time);  })};var start = async function () {  let result = await sleep(3000);  console.log(result); // 收到 ‘ok'};

3、await 后面跟著的應該是一個promise對象。

如果是同步執行的代碼沒有必要使用 await 修飾了。

4、await 只能使用在原生語法中,比如在 forEeach 結構中使用 await 是無法正常工作的,必須使用 for 循環的原生語法。

async function dbFuc(db) { let docs = [{}, {}, {}]; // 可能得到錯誤結果 docs.forEach(async function (doc) {  await db.post(doc); });}

如果確實希望多個請求并發執行,可以使用 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);}

四、錯誤捕獲

既然.then(..)不用寫了,那么.catch(..)也不用寫,可以直接用標準的try catch語法捕捉錯誤。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 平昌县| 凤台县| 井冈山市| 奉节县| 白银市| 江山市| 巴青县| 漯河市| 鄯善县| 龙陵县| 迁安市| 清流县| 珠海市| 肇东市| 济南市| 东宁县| 青岛市| 屯留县| 耿马| 隆德县| 武威市| 正阳县| 即墨市| 盱眙县| 云林县| 中牟县| 淮安市| 长泰县| 碌曲县| 嫩江县| 双辽市| 建始县| 门头沟区| 乐陵市| 桐梓县| 绥芬河市| 法库县| 德阳市| 库车县| 尼玛县| 龙陵县|