1. 程式人生 > >node.js中同步/非同步處理模組async解析

node.js中同步/非同步處理模組async解析

Async非同步處理模組!

安裝很簡單,就跟普通的安裝模組一樣就行了

npm install --save-dev async

這樣就安裝成功了! 接下來就是引用了,在程式碼裡引用模組:

var async = require('async');

這樣引用也就ok了!在程式碼後面就可以輕鬆的用async這個對像模組了!
查了下官方文件,這個模組的方法實在是太多了!看的眼花……
下面我們來談談小sam覺得比較常用到的幾個方法就好了 

series

1.series(tasks, [callback]) 順序執行陣列、集合內的函式,當前面一個函式執行完成就會立即執行下一個函式,如果函式觸發了錯誤,可以在callback函式中驗證,否則會一直執行完成tasks

話多沒用,程式碼才是親爹

用例:

//tasks傳的是一個數組函式
async.series([
   function(callback) {
   // do some stuff ...
   callback(null, 'one');
},
  function(callback) {
  // do some more stuff ...
  callback(null, 'two');
}],
// optional callback
function(err, results) {
// results is now equal to ['one', 'two']
});
// an example using an object instead of an 

//我覺得這裡很重要err是上面兩個函式的錯誤資訊,而results這個引數是一個數組物件,它們的值是上面陣列函式每個callback裡面的引數。

 
//下面的程式碼其實跟上面的差不多,只是stasks傳的是物件而不是陣列
async.series({
one: function(callback) {
    setTimeout(function() {
        callback(null, 1);
    },
    200);
},
two: function(callback) {
    setTimeout(function() {
        callback(null, 2);
    },
    100);
  }
},
function(err, results) {
// results is now equal to: {one: 1, two: 2}
});

parallel

2.parallel(tasks, [callback])  並行執行陣列、集合內的方法,不用等到前一個函式執行完再執行下一個函式,如果函式觸發了錯誤,可以在callback函式中驗證

 async.parallel(
[
  function(callback) {
    setTimeout(function() {
          callback(null, 'one');
        },
    200);
  },
  function(callback) {
    setTimeout(function() {
        callback(null, 'two');
    },
    100);
  }
],
 // optional callback
 function(err, results) {
    // the results array will equal ['one','two'] even thoug
    // the second function had a shorter             
    timeout
 }
); 

parallelLimit

3.parallelLimit(tasks, limit, [callback])  和2用法一樣,只是多了一個任務數量限制,最多允許多少個任務在並行執行

whilst

4.whilst(test, fn, callback)  等同於while的用法,第一個引數為驗證條件,第二個引數為執行函式,第三個引數為驗證失敗後回撥函式,一般在做延遲動畫用的比較多

 var count = 0;
 async.whilst(
  function () { return count < 5; },
  //驗證成    功繼續,失敗進回撥
  function (callback) {
      count++;
      setTimeout(callback, 1000);
  },
  function (err) {
     // 5 seconds have passed
 }
);

waterfall

5.waterfall(tasks, [callback])  tasks依次執行,前一個函式的回撥會作為後一個函式的引數,如果有任何任務通過一個錯誤的回撥,下一個函式不執行

async.waterfall([
  function(callback){
      callback(null, 'one', 'two');
  },
  function(arg1, arg2, callback){
   // arg1 now equals 'one' and arg2 nowequals 'two'
      callback(null, 'three');
 },
  function(arg1, callback){
     // arg1 now equals 'three'
     callback(null, 'done');
 }
 ], function (err, result) {
    // result now equals 'done'    
});

compose

6.compose(fn1, fn2...)  按順序加入到佇列中,按順序執行,將上一個函式的結果作為下一個函式的值

function add1(n, callback) {
  setTimeout(function () {
      callback(null, n + 1);
  }, 10);
  }

 function mul3(n, callback) {
  setTimeout(function () {
      callback(null, n * 3);
 }, 10);
}

var add1mul3 = async.compose(mul3, add1);

 add1mul3(4, function (err, result) {
// result now equals 15
});