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

async/await與promise(nodejs中的異步操作問題)

 更新時間:2017年03月03日 11:09:41   作者:晴天_雨天  
這篇文章主要介紹了async/await與promise(nodejs中的異步操作問題),非常不錯,具有參考借鑒價值,需要的朋友可以參考下

舉例寫文章詳情頁面的時候的一個場景:首先更改文章詳情中的 PV,然后讀取文章詳情,然后根據(jù)文章詳情中文章 Id 查閱該文章評論和該文章作者信息。獲取全部數(shù)據(jù)之后渲染文章詳情頁。數(shù)據(jù)庫操作都是異步的,最直接想到的辦法就是一層一層的回調函數(shù),問題出來了:十分不雅觀,要是層再多一點還會有更多麻煩。怎么解決?業(yè)內為了處理異步操作問題也是拼了,什么async,q,bluebird,co,處理方式不同,各有千秋,感興趣可以了解一下,但是驚喜的發(fā)現(xiàn)nodejs 7.6已經(jīng)默認支持ES7中的 async/await 了,結合ES6中的 promise對象,用起來不亦樂乎的。

Async/await的主要益處是可以避免回調地獄(callback hell)問題。

基本概念:

async 表示這是一個async函數(shù),await只能用在這個函數(shù)里面。

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

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'
};

捕捉錯誤:

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`
  }
};

 在循環(huán)中:

var start = async function () {
  for (var i = 1; i <= 10; i++) {
    console.log(`當前是第${i}次等待..`);
    await sleep(1000);
  }
};

再循環(huán)中使用不需要閉包,每次循環(huán)會被阻塞。

最前面提到的場景:(綜合使用)

var showArticle = async function () {
    await new Promise(function (resolve, reject) {
      PostModel.incPv(postId, function (result) {
        resolve(result);
      });
    });// pv 加 1
    var post = await new Promise(function (resolve, reject) {
      PostModel.getPostById(postId, function (article) {
        resolve(article);
      });
    });// 獲取文章信息
    await new Promise(function (resolve, reject) {
      userModel.getUserById(post.author,function (author) {
        post.author=author;
        resolve();
      })
    });//獲取文章作者
    var comments = await new Promise(function (resolve, reject) {
      CommentModel.getComments(post._id, function (comment) {
        resolve(comment);
      });
    });// 獲取該文章所有留言
    for(var i=0;i<comments.length;i++){
      await new Promise(function (resolve, reject) {
        userModel.getUserById(comments[i].author,function (author) {
          comments[i].author=author;
          resolve();
        })
      });//獲取文章留言作者
    }
    if (!post) {
      req.session.error = '該文章不存在';
      return res.redirect('/post');
    }
    res.render('post',{post: post, comments: comments});
  };
  showArticle();

以上所述是小編給大家介紹的async/await與promise(nodejs中的異步操作問題),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關文章

  • nodejs中使用archive壓縮文件的實現(xiàn)代碼

    nodejs中使用archive壓縮文件的實現(xiàn)代碼

    這篇文章主要介紹了nodejs中使用archive壓縮文件的實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11
  • ajax +NodeJS 實現(xiàn)圖片上傳實例

    ajax +NodeJS 實現(xiàn)圖片上傳實例

    本篇文章主要介紹了ajax +NodeJS 實現(xiàn)圖片上傳實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • NodeJS實現(xiàn)不可逆加密與密碼密文保存的方法

    NodeJS實現(xiàn)不可逆加密與密碼密文保存的方法

    這篇文章主要介紹了NodeJS實現(xiàn)不可逆加密與密碼密文保存的方法,簡單講述了不可逆加密與密碼密文保存的原理并結合實例形式分析了nodejs相關加密操作實現(xiàn)技巧,需要的朋友可以參考下
    2018-03-03
  • npm 常用命令詳解(小結)

    npm 常用命令詳解(小結)

    這篇文章主要介紹了npm 常用命令詳解(小結),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • nodejs實現(xiàn)黑名單中間件設計

    nodejs實現(xiàn)黑名單中間件設計

    最近寫的項目中涉及到防止灌水的功能,于是設計了黑名單中間件,跟大家分享一下,同時也希望大家有好的建議能夠拍磚.
    2014-06-06
  • Node.js下自定義錯誤類型詳解

    Node.js下自定義錯誤類型詳解

    在JavaScript里面,運行過程中的錯誤的類型總是被人忽略,這篇文章給大家詳細介紹了如何在Node.js下自定義錯誤類型,對大家學習或者使用Node.js具有一定的參考借鑒價值,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-10-10
  • node.js調用Chrome瀏覽器打開鏈接地址的方法

    node.js調用Chrome瀏覽器打開鏈接地址的方法

    其實在Node.JS中打開瀏覽器網(wǎng)址非常簡單,但還是有必要整理下分享給有需要的朋友們,這篇文章主要給大家介紹了node.js如何調用Chrome瀏覽器打開鏈接地址的方法,文中介紹的非常詳細,需要的朋友們下面隨著小編來一起看看吧。
    2017-05-05
  • node.js報錯:npm?ERR?code?EPERM的解決過程

    node.js報錯:npm?ERR?code?EPERM的解決過程

    在學習vue+typescript的時候突然發(fā)現(xiàn)了個錯誤,所以下面這篇文章主要給大家介紹了關于node.js報錯:npm?ERR?code?EPERM的詳細解決過程,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • node 利用進程通信實現(xiàn)Cluster共享內存

    node 利用進程通信實現(xiàn)Cluster共享內存

    本篇文章主要介紹了node 利用進程通信實現(xiàn)Cluster共享內存,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • 使用Node.js為其他程序編寫擴展的基本方法

    使用Node.js為其他程序編寫擴展的基本方法

    這篇文章主要介紹了使用Node.js為其他程序編寫擴展的基本方法 ,文中示例是通過Node讓JavaScript代碼與C++應用產(chǎn)生交互,需要的朋友可以參考下
    2015-06-06

最新評論

平谷区| 东明县| 始兴县| 怀安县| 阿坝| 长兴县| 元谋县| 怀宁县| 武威市| 成安县| 深泽县| 葫芦岛市| 威海市| 鄂托克旗| 顺昌县| 通河县| 郑州市| 海安县| 庆元县| 张家界市| 禹城市| 长子县| 木里| 四会市| 鹿泉市| 高青县| 册亨县| 建宁县| 大荔县| 台南市| 竹北市| 雅江县| 石屏县| 平乐县| 南江县| 密山市| 怀仁县| 额尔古纳市| 垣曲县| 凌海市| 巴楚县|