亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2018年05月10日 09:21:44   作者:小一輩無產(chǎn)階級碼農(nóng)  
這篇文章主要介紹了詳解Async/Await 更好的異步編程解決方案,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

前幾天寫過關(guān)于 javascript 異步操作的文章《Javascript Promise 詳解》. 最近在學(xué)習(xí) Puppeteer 的時候又發(fā)現(xiàn)另一種異步編程解決方案:Async/Await.

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

在 Async 函數(shù)出來之后,有人認(rèn)為它是異步編程的最終解決方案。因?yàn)橛辛?Async/Await 之后,你根本就不用關(guān)心是它是不是異步編程。

二、基本用法

async 函數(shù)返回一個 Promise 對象,可以使用 then 方法添加回調(diào)函數(shù)。 當(dāng)函數(shù)執(zhí)行的時候,一旦遇到 await 就會先返回,等到觸發(fā)的異步操作完成,再接著執(zhí)行函數(shù)體內(nèi)后面的語句。

下面是一個栗子:

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();

執(zhí)行上面的代碼,你會發(fā)現(xiàn),控制臺先輸出start,稍等3秒后,輸出了end。

三、注意事項(xiàng)

1、await 命令只能用在 async 函數(shù)之中,如果用在普通函數(shù),就會報(bào)錯。

async function dbFuc(db) {
 let docs = [{}, {}, {}];

 // 報(bào)錯
 docs.forEach(function (doc) {
  await db.post(doc);
 });
}

2、await 表示在這里等待promise返回結(jié)果了,再繼續(xù)執(zhí)行。

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 后面跟著的應(yīng)該是一個promise對象。

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

4、await 只能使用在原生語法中,比如在 forEeach 結(jié)構(gòu)中使用 await 是無法正常工作的,必須使用 for 循環(huán)的原生語法。

async function dbFuc(db) {
 let docs = [{}, {}, {}];

 // 可能得到錯誤結(jié)果
 docs.forEach(async function (doc) {
  await db.post(doc);
 });
}

如果確實(shí)希望多個請求并發(fā)執(zhí)行,可以使用 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(..)也不用寫,可以直接用標(biāo)準(zhǔn)的try catch語法捕捉錯誤。

var sleep = function (time) {
  return new Promise(function (resolve, reject) {
    setTimeout(function () {
      // 模擬出錯了,返回 ‘error'
      reject('error');
    }, time);
  })
};

var start = async function () {
  try {
    console.log('start');
    await sleep(3000); // 這里得到了一個返回錯誤
    
    // 所以以下代碼不會被執(zhí)行了
    console.log('end');
  } catch (err) {
    console.log(err); // 這里捕捉到錯誤 `error`
  }
};

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • node.js操作mongodb簡單示例分享

    node.js操作mongodb簡單示例分享

    MongoDB是基于Javascript語言的數(shù)據(jù)庫,存儲格式是JSON,而Node也是基于JavaScript的環(huán)境(庫),所以node和mongoDB的搭配能減少因?yàn)閿?shù)據(jù)轉(zhuǎn)換帶來的時間空間開銷。今天我們來看看如何通過node.js來操作MongoliaDB
    2017-05-05
  • Nodejs 和 Electron ubuntu下快速安裝過程

    Nodejs 和 Electron ubuntu下快速安裝過程

    本文較為詳細(xì)的給大家介紹了Nodejs 和 Electron ubuntu下快速安裝過程,非常不錯,具有一定的參考借鑒價(jià)值,感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧
    2018-05-05
  • nodejs項(xiàng)目windows下開機(jī)自啟動的方法

    nodejs項(xiàng)目windows下開機(jī)自啟動的方法

    今天小編就為大家分享一篇nodejs項(xiàng)目windows下開機(jī)自啟動的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-11-11
  • Koa2中間件的作用及路由實(shí)現(xiàn)實(shí)例詳解

    Koa2中間件的作用及路由實(shí)現(xiàn)實(shí)例詳解

    這篇文章主要介紹了Koa2中間件的作用及路由實(shí)現(xiàn)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • 搭建一個nodejs腳手架的方法步驟

    搭建一個nodejs腳手架的方法步驟

    這篇文章主要介紹了如何搭建一個nodejs腳手架的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • 詳解Node.js 中使用 ECDSA 簽名遇到的坑

    詳解Node.js 中使用 ECDSA 簽名遇到的坑

    這篇文章主要介紹了詳解Node.js 中使用 ECDSA 簽名遇到的坑,主要是使用 Node.js 的 Crypto 模塊無法校驗(yàn)網(wǎng)絡(luò)傳輸過來的簽名結(jié)果,感興趣的小伙伴們可以參考一下
    2018-11-11
  • 前端如何更好的展示后端返回的十萬條數(shù)據(jù)

    前端如何更好的展示后端返回的十萬條數(shù)據(jù)

    這篇文章主要為大家介紹了前端如何更好的展示后端返回的十萬條數(shù)據(jù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2021-11-11
  • 快速了解Node中的Stream流是什么

    快速了解Node中的Stream流是什么

    今天小編就為大家分享一篇關(guān)于快速了解Node中的Stream流是什么,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • node.js中的fs.createWriteStream方法使用說明

    node.js中的fs.createWriteStream方法使用說明

    這篇文章主要介紹了node.js中的fs.createWriteStream方法使用說明,本文介紹了fs.createWriteStream方法說明、語法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • Nodejs從有門道無門菜鳥起飛必看教程

    Nodejs從有門道無門菜鳥起飛必看教程

    下面小編就為大家?guī)硪黄狽odejs從有門道無門菜鳥起飛必看教程。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-07-07

最新評論