Async.js用來處理異步的調用


在官方網站中,是這樣介紹的,這是一個用來處理異步js的工具包。它提供了一些直觀的,功能強大的函數。盡管它最初是為node.js來設計的,它也可以直接用在browser中。

先來看一段代碼(需要在nodejs中運行):

View Code
var fs = require('fs');
var async = require('async');
process.chdir('testAsync');
var concatenation = '';
var dirContents = fs.readdirSync('.');

async.filter(dirContents, isFilename, function(filenames){
    async.forEachSeries(filenames, readAndContent, onComplete);    
});

function isFilename(filename, callback){
    fs.stat(filename, function(err, stats){
        if(err) throw err;
        callback(stats.isFile());
    });
}

function readAndContent(filename, callback){
    fs.readFile(filename, 'utf8', function(err, fileContents){
        if(err) return callback(err);
        concatenation += fileContents;
        callback();
    });
}

function onComplete(err) {
    if(err) throw err;
    console.log(concatenation);
}

上述的代碼需要在當前路徑下新那一個foler,命名為testAsync, 並在其中建立幾個文本文件,這樣我們在nodejs testAsync.js,將會在命令行下,顯示這幾個文件的內容。

現在讓我們來分析一下我們用到了幾個函數:

filter, forEach這是async所提供的眾多函數中的其中一個,這兩個函數和jQuery中的filter,each幾乎起到了相同的作用。另外,還有下列的函數:

reject/rejectSeries, 和filter是相反的用法。

map/mapSeries, 1:1的轉換,最后返回轉化后的數組。

reduce/reduceRight,對於每一項進行處理,上一個處理結果轉入下一個新項中

detect/dectectSeries,找出一項

sortBy, some, every

上述只是Async提供的最核心的代碼應用之一,我們來看一下它是如何來控制我們流程的:

流程控制:

如果我們用js來實現一個順序執行的函數,就應該如下所示:

funcs[0](function(){

  funcs[1](function(){

    funcs[2](onComplete);

  });

});

看看Async是如何來實現的:

View Code
var async = require('async');
var start = new Date;

async.series([
    function(callback){setTimeout(callback,100);},
    function(callback){setTimeout(callback,300);},
    function(callback){setTimeout(callback,200);}
],function(err,results){
    console.log('Completed in'+(new Date - start) +'ms');
});

上述結果大概是600ms左右,因為它們是順序執行的。如果我們把async.series/async.waterfall改為async.parallel時間就會變為300ms左右。

上述兩個函數在流程控制方面其實是有很多限制的:

1. 我們無法動態的改變我們的task array.

2.無法查詢已經完成了多少功能。

所以async還提供了另外一個函數:async.queue

它會接收兩個參數,一個是worker, 另一個是同時能處理的任務的個數:

View Code
var async = require('async');

function worker(data, callback){
  console.log(data);
 callback();  
}

var concurrency = 2;
var queue = async.queue(worker, concurrency);
queue.push(1);
queue.push(2);
queue.push(3);

參考資料:

Async Javascript Build More Responsive Apps with less code

https://github.com/caolan/async


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM