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函数