標籤:
首先,我們都知道,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