最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

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

二、基本用法

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

下面是一個(gè)栗子:

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í)行上面的代碼,你會(huì)發(fā)現(xiàn),控制臺(tái)先輸出start,稍等3秒后,輸出了end。

三、注意事項(xiàng)

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

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

 // 報(bào)錯(cuò)
 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)該是一個(gè)promise對(duì)象。

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

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

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

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

如果確實(shí)希望多個(gè)請(qǐng)求并發(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);
}

四、錯(cuò)誤捕獲

既然.then(..)不用寫了,那么.catch(..)也不用寫,可以直接用標(biāo)準(zhǔn)的try catch語法捕捉錯(cuò)誤。

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

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

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

相關(guān)文章

  • Node.js(安裝,啟動(dòng),測(cè)試)

    Node.js(安裝,啟動(dòng),測(cè)試)

    這里主要介紹基于windows平臺(tái)上最簡單方便的安裝方式,啟動(dòng)以及簡單測(cè)試
    2014-06-06
  • 關(guān)于Node.js中Buffer的一些你可能不知道的用法

    關(guān)于Node.js中Buffer的一些你可能不知道的用法

    網(wǎng)上關(guān)于Node.js中Buffer用法的文章有很多,但是感覺還是不夠詳細(xì),所以這篇文章主要介紹了關(guān)于Node.js中Buffer的一些你可能不知道的用法,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-03-03
  • 利用Node.js檢測(cè)端口是否被占用的方法

    利用Node.js檢測(cè)端口是否被占用的方法

    這篇文章主要給大家介紹了關(guān)于利用Node.js檢測(cè)端口是否被占用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • 淺談node node-sass sass-loader版本對(duì)應(yīng)問題

    淺談node node-sass sass-loader版本對(duì)應(yīng)問題

    本文主要介紹了淺談node node-sass sass-loader版本對(duì)應(yīng)問題,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 快速掌握Node.js模塊封裝及使用

    快速掌握Node.js模塊封裝及使用

    這篇文章主要為大家詳細(xì)介紹了Node.js模塊封裝及使用,幫助大家快速掌握Node.js模塊封裝及使用,感興趣的小伙伴們可以參考一下
    2016-03-03
  • NodeJS通過魔術(shù)封包喚醒局域網(wǎng)計(jì)算機(jī)實(shí)例

    NodeJS通過魔術(shù)封包喚醒局域網(wǎng)計(jì)算機(jī)實(shí)例

    這篇文章主要為大家介紹了NodeJS通過魔術(shù)封包喚醒局域網(wǎng)計(jì)算機(jī)代碼實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Koa2框架快速入門與基本使用方式

    Koa2框架快速入門與基本使用方式

    這篇文章主要介紹了Koa2框架快速入門與基本使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • better?sqlite3安裝node?gyp原生模塊編譯prebuild-install

    better?sqlite3安裝node?gyp原生模塊編譯prebuild-install

    這篇文章主要為大家介紹了Nodejs關(guān)于原生模塊編譯node-gyp?+?prebuild-install?(以安裝?better-sqlite3為例)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • node.js突破nginx防盜鏈機(jī)制,下載圖片案例分析

    node.js突破nginx防盜鏈機(jī)制,下載圖片案例分析

    這篇文章主要介紹了node.js突破nginx防盜鏈機(jī)制,下載圖片的方法,結(jié)合具體案例形式分析了防盜鏈的相關(guān)原理與node.js使用axios庫下載防盜鏈圖片的相關(guān)操作技巧,需要的朋友可以參考下
    2023-04-04
  • 獨(dú)立部署小程序基于nodejs的服務(wù)器過程詳解

    獨(dú)立部署小程序基于nodejs的服務(wù)器過程詳解

    這篇文章主要介紹了獨(dú)立部署小程序基于nodejs的服務(wù)器過程詳解,完全自定義的部署小程序服務(wù)器, 不依托于騰訊云服務(wù)器體系. 以阿里云服務(wù)器為基礎(chǔ)建立.服務(wù)器語言選用nodejs.,需要的朋友可以參考下
    2019-06-06

最新評(píng)論

寿宁县| 铜山县| 商都县| 金堂县| 绥宁县| 嘉峪关市| 嘉鱼县| 克山县| 龙胜| 清河县| 邢台县| 田东县| 遵义市| 遂宁市| 双峰县| 惠来县| 句容市| 桦川县| 西乌| 新疆| 东丽区| 城市| 平安县| 南川市| 衡阳县| 泗洪县| 丰原市| 搜索| 铅山县| 汽车| 宜章县| 周宁县| 奇台县| 大宁县| 赫章县| 玛曲县| 凉城县| 扎兰屯市| 大关县| 泗阳县| 封开县|