Node.js 异步和同步(代码)
不多bb,直接上代码
var mysql = require('mysql'); var co = require("co"); var async = require('async'); var connection = mysql.createConnection({ host : '*', user : '*', password : '*', database : '*' }); connection.connect(); /* 原始写法 */ //connection.query('SELECT * from tb_user', function (error, results, fields) { // if (error) throw error; // console.log (results[0].username); //}); var getSqlResult = (sql)=>{ return new Promise(function(resolve, reject) { connection.query(sql, function (error, results, fields) { if (error) throw error; resolve (results); }); }); }; /* 写法1 使用co函数和yield */ //co(function *(){ // var sql = "SELECT * from tb_user where username='bird'"; // var result = yield getSqlResult(sql); // console.log(result); // var sql1 = `select * from tb_user where password=${result[0].password}`; // var result1 = yield getSqlResult(sql1); // console.log(result1); //}); /*写法2 使用async和await*/ //(async ()=>{ // let i = await getSqlResult("SELECT * from tb_user"); // console.log(i); //})(); /*写法3 使用async模块进行控制(功能十分强大)*/ /* 3.1 利用 async series 控制串行无关联流程,多个函数从上到下依次执行,相互之间没有数据交互 这里面强调的是有顺序要求的场景*/ //console.time('s1'); //async.series({ // flag1:function(done){ //flag1 是一个流程标识,用户自定义 // var name = "bird"; // console.log('正在进行第一步'); // connection.query(`select * from tb_user where username='${name}'`, function (error, results, fields) { // if (error) { // done(error,null);//第一个参数是异常错误,第二个参数的返回结果 // }else{ // console.log('查询第一步 完成,结果是:'+results); // done(null,results); // } // }); // }, // flag2:function(done){ // var name = "bird"; // console.log('正在进行第二步'); // connection.query(`select * from tb_key where uname='${name}'`, function (error, results, fields) { // if (error) { // done(error,null);//第一个参数是异常错误,第二个参数的返回结果 // }else{ // console.log('查询第二步 完成,结果是:'+results); // done(null,results); // } // }); // } //},function(error,result){ // //最后结果 // //result是返回结果总集,包含了所有的流程控制 , // //result.flag1 可以获取标识1中处理的结果 // console.log('查询完成!'); // console.log(result.flag1); // console.timeEnd('s1');//获取程序运行的时间 //}); /* 3.2 利用 async parallel 控制并行且无关联流程,同时并行处理每一个流程 */ //console.time('s1'); //async.parallel({ // flag1:function(done){ //flag1 是一个流程标识,用户自定义 // var name = "bird"; // console.log('正在进行第一步'); // connection.query(`select * from tb_user where username='${name}'`, function (error, results, fields) { // if (error) { // done(error,null); // 第一个参数是异常错误,第二个参数的返回结果 // }else{ // console.log('查询第一步 完成,结果是:'+results); // done(null,results); // } // }); // }, // flag2:function(done){ // var name = "bird"; // console.log('正在进行第二步'); // connection.query(`select * from tb_key where uname='${name}'`, function (error, results, fields) { // if (error) { // done(error,null);//第一个参数是异常错误,第二个参数的返回结果 // }else{ // console.log('查询第二步 完成,结果是:'+results); // done(null,results); // } // }); // } //},function(error,result){ // //最后结果 // //result是返回结果总集,包含了所有的流程控制 , // //result.flag1 可以获取标识1中处理的结果 // console.log('查询完成!'); // console.log(result.flag1); // console.timeEnd('s1');//获取程序运行的时间 //}); /* 3.3 利用 async waterfall 控制串行且有关联流程,每一步执行时需要由上一步执行的结果当做参数,所以每一步必须串行等待 */ async.waterfall([ function (done) { var name = "bird"; getSqlResult(`select * from tb_key where uname='${name}'`).then(function(data){ done(null,data); },function(err){ done(err, null); }); }, function (onearg, done) { getSqlResult(`select * from tb_pay where ukey='${onearg[0].ukey}'`).then(function(data){ done(null,data); },function(err){ done(err, null); }); } ], function (error, result) { console.log(result); });