Nodejs中使用異步流程控制Async


  首先,我們都知道,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     // 將每一項的名字更新為gdt
30     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和其對應的index
47         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函數

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM