node模块async
async模块是为了解决异步回调大坑而存在的,尤其是在用了mysql模块的时候,简直要命啊,
虽然现在又es6的
Promise Generator Async(es7)
但是对于还不怎么用es6的人,简直是神器.
npm 安装好async模块,
然后引入就可以使用 var async = require('async');
他有几种模式
1.waterfall(tasks,[callback]) :瀑布流,个人用最多,最重要的一个
依次执行,前一个函数的输出为后一个函数的输入
如果中途出现错误,后面的函数将不在执行,之前执行的结果和错误信息将直接传到最终的回调函数
const express =require('express'); const bodyParser = require('body-parser'); const mysql = require('mysql'); const async =require('async'); const db = mysql.createPool({host:'localhost',user:'root',password:'123456',database:'test'}); var server = express(); server.listen(8090); server.use(bodyParser.urlencoded({extended: false})); server.use(bodyParser.json()); server.post('/',(req,res)=>{ var qingqiu = function(callback){ db.query(`SELECT * FROM user_table WHERE user_ID= "${req.body.user_ID}"`,(err,data)=>{ if(err){ console.log(err); res.status(500).send('database error').end(); } else{ callback(null, data); //callback(错误信息,传递的数据) } }) } //q为接收的数据 var qingqiu2 = function(q,callback){ console.log(q[0].user_ID); db.query(`SELECT count FROM user_table WHERE user_ID= "${q[0].user_ID}"`,(err,data)=>{ if(err){ console.log(err); res.status(500).send('database error').end(); } else{ console.log(data); callback(null, data[0]); } }) } //执行 async.waterfall([qingqiu,qingqiu2],function(err,result){ if (err) { console.log(err); } }) });
2. series(tasks,[callback])
多个函数从上到下依次执行,相互之间没有数据交互,
如果中途发生错误,则将错误传递到回调函数,并停止执行后面的函数
3.parallel(tasks,[callback])
多个函数并行执行,不会等待其他函数
如果中途出错,则立即将err和值传到最终的回调函数,其他未执行完毕的函数将不再执行,但是要占一个位置
4.parallelLimit(tasks,limit,[callback])
和parallel类似,只是limit参数限制了同时并发执行的个数,不再是无限并发
5.auto(tasks,[callback])
多个函数有数据交互,有的并行,有的依次执行
6.whilst(test,fn,[callback])
相当于while循环,fn函数里不管是同步还是异步都会执行完上一次循环才会执行下一次循环,对异步循环很有帮助,
test是条件,为true时执行fn里的方法
7.doWhilst
和whilst类似,和do-while一个意思,首先执行一次fn,再判断,和whilst相比它把fn和test位置交换了而已.
until和whilst相反,当test判断为false的时候执行fn里的方法,为true时跳出,
doUntil与doWhilst相反.
8.forever(fn,errback)
forever就是无限循环了.只有当中途出现错误的时候才会停止
9.compose(fn1,fn2,fn3...)
这个方法会创建一个异步的集合函数,执行的顺序是倒序.前一个fn的输出是后一个fn的输入.有数据交互
[0]