Javascript非同步程式設計async實現過程詳解
async官方DOC
介紹
node安裝
npm install async --save
使用
var async = require('async')
js檔案
https://github.com/caolan/async/tree/master/dist
async提供了很多函式用於非同步流程控制,下面是async核心的幾個函式,完整的函式請看async官方DOC
async.map(['file1','file2','file3'],fs.stat,function(err,results) { // results is now an array of stats for each file }); async.filter(['file1',function(filePath,callback) { fs.access(filePath,function(err) { callback(null,!err) }); },results) { // results now equals an array of the existing files }); async.parallel([ function(callback) { ... },function(callback) { ... } ],results) { // optional callback }); async.series([ function(callback) { ... },function(callback) { ... } ]);
series序列
series的作用就是按照順序一次執行。
async.series([ function(callback) { setTimeout(function() { callback(null,1) },2000); },function(callback) { callback(null,2); }],results) { console.log(results); });
輸出結果為
[ 1,2 ]
series函式的第一個引數可以是一個數組也可以是一個JSON物件,引數型別不同,影響的是返回資料的格式。
async.series({ one: function(callback){ callback(null,1); },two: function(callback){ callback(null,2); } },results) { console.log(results); });
輸出為
{one: 1,two: 2}
waterfall瀑布流
waterfall和series函式都是按照順序執行,不同之處是waterfall每個函式產生的值都可以傳遞給下一個函式,series不可以。
async.waterfall([ function(callback) { callback(null,'one','two'); },function(arg1,arg2,callback) { // arg1 now equals 'one' and arg2 now equals 'two' console.log('function 2') console.log('arg1: ' + arg1) console.log('arg2: ' + arg2) callback(null,'three'); },callback) { console.log('function 3') console.log('arg1: ' + arg1) // arg1 now equals 'three' callback(null,'done'); } ],result) { // result now equals 'done' console.log(result); });
輸出
function 2
arg1: one
arg2: two
function 3
arg1: three
done
waterfall第一個引數只能為陣列。當中途有函數出錯,其err直接傳給最終callback,結果被丟棄,後面的函式不再執行。
parallel(tasks,[callback])
paraller函式是並行執行多個函式,每個函式都是立即執行,不需要等待其它函式先執行。
傳給最終callback的陣列中的資料按照tasks中宣告的順序,而不是執行完成的順序。
async.parallel([ function(callback){ callback(null,'one'); },function(callback){ callback(null,'two'); } ],results){ });
tasks引數可以是一個數組或是json物件,和series函式一樣,tasks引數型別不同,返回的results格式會不一樣。
將示例中tasks的回撥函式用setTimeout在1000毫秒後呼叫,然後在parallel的回撥函式中輸出results,看一看整個過程花費了1s還是2s。
var async=require("async"); async.parallel([ function(callback){ setTimeout(function(){ callback(null,'one') },1000); },function(callback){ setTimeout(function(){ callback(null,'two') },1000); } ],results){ console.log(results); });
parallelLimit(tasks,limit,[callback])
parallelLimit函式和parallel類似,但是它多了一個引數limit。 limit引數限制任務只能同時併發一定數量,而不是無限制併發,示例如下:
async.parallelLimit([ function(callback){ callback(null,2,results){ });
將示例中tasks的回撥函式用setTimeout在1000毫秒後呼叫,limit引數設定為1,然後在parallelLimit的回撥函式中輸出results,看一看整個過程花費了1s還是2s。
var async=require("async"); async.parallelLimit([ function(callback){ setTimeout(function(){ callback(null,'one'); },'two'); },1,results){ console.log(results); });
map(coll,iteratee,callbackopt)
map函式遍歷傳入的陣列,並執行同樣的操作,最終返回結果
cool:陣列
iteratee:對陣列每一項要執行的函式
callbackopt:回撥函式
async.map([1,3,4,5],function(item,callback) { callback(null,item + 5) },result) { console.log(result) })
[ 6,7,8,9,10 ]
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。