首先,我們都知道,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函數
