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);
});

 

posted @ 2017-11-20 11:13  可恶の小郑  阅读(195)  评论(0编辑  收藏  举报