Nodejs中使用非同步流程式控制制Async

來源:互聯網
上載者:User

標籤:

  首先,我們都知道,Node基於事件驅動的非同步I/O架構,所謂非同步就是非阻塞,說白了就是一個事件執行了,我不必等待它執行完成後我才能執行下一個事件。所以在Node環境中的模組基本都是非同步,上一篇說到我在項目中改用了easymysql模組代替mysql模組,兩個模組作查詢的操作都是非同步,所以要實現巢狀查詢往往會很麻煩,而且很大可能會報錯。為此,為了實現查詢同步,我引進了非同步流程式控制制async模組,讓js非同步作業變成同步操作,這樣一方面方便閱讀理解,另一方面能夠很好實現需求的目標,親測有效~

update.js檔案

 1 ‘use strict‘ 2 var async = require(‘async‘); 3 var Client = require(‘easymysql‘); 4 var mysql = Client.create({ 5     ‘maxconnections‘: 10 6 }) 7 mysql.addserver({ 8     host: ‘localhost‘, 9     user: ‘test‘,10     password: ‘123456‘,11     database: ‘database‘12 })13 14 exports.match = function(req, res) {15     //獲得需要所有記錄資訊16     function getInfo() {17         return new Promise((resolve, reject) => {18             mysql.query(‘SELECT `index`,`name` from tableA‘, function(err, result) {19                 if (err) {20                     console.log(err);21                 } else {22                     resolve(result);23                 }24             })25 26         })27     }28 29     // 將每一項的名字更新為gdt30     function updateName(info) {31         return new Promise((resolve, reject) => {32             var index = info[‘index‘];33             var sql = "UPDATE  `tableA` SET `tableB`.`name` = ‘gdt‘ WHERE `tableA`.`index` =" + index;34             mysql.query(sql, function(err, result) {35                 if (err) {36                     console.log(err);37                 } else {38                     resolve(‘更新成功‘);39                 }40             })41         })42     }43 44     async function update() {45         let result = ‘‘;46         //篩選出在公屏發言出現的環球uid和其對應的index47         var getinfoResult = await getInfo();48         for (let i = 0; i < getinfoResult.length; i++) {49             var updateResult = await updateName(getinfoResult[i]);50             console.log(updateResult);51         }52         return result ? result : ‘success‘;53     }54 55     update().then(function(result) {56         console.log(result);57 58         //斷開資料庫連接59         connection.end();60     })61 }

.babelrc檔案(使用ES7的Async/Await需要進行babel轉碼)

{  "presets": [    "stage-0"  ],   "plugins": ["transform-async-to-generator"]}

  以上代碼只是舉例,主要是來說明async的使用,並不能直接運行,實現的需求應該很容易理解,就是在table表中找到所以記錄的index和name欄位,存放在

getinfoResult變數中,然後該變數遍曆每一項,進行更新操作。因為有了async流程式控制制將getInfo()和updateName(getinfoResult[i])兩個非同步作業改成同步進行,這樣程式運行起來才不會因為非同步原因而報錯。

 

關於async的詳細可以查看阮一峰大神的教程: 非同步作業和Async函數

 

Nodejs中使用非同步流程式控制制Async

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.