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]