node異步編程的集中解決方案

一丶經過遞歸處理異步回調

var fs = require('fs');
// 要處理的文件列表
var files = ['file1', 'file2', 'file3'];

function parseFile () {
  if (files.length == 0) {
    return;
  }
  var file = files.shift();
  fs.readFile(file, function (err, data) {
    // 這裏處理文件數據
    parseFile();  // 處理完畢後,經過遞歸調用處理下一個文件
  });
}

// 開始處理
parseFile();

二丶採用Async、Promise等第三方庫處理異步回調(項目中我本身採用的是async)

關於async總結:數組

1.series(tasks, [callback]) 順序執行數組、集合內的函數,當前面一個函數執行完成就會當即執行下一個函數,若是函數觸發了錯誤,能夠在callback函數中驗證,不然會一直執行完成tasks異步

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}
});

2.parallel(tasks, [callback])  並行執行數組、集合內的方法,不用等到前一個函數執行完再執行下一個函數,若是函數觸發了錯誤,能夠在callback函數中驗證async

 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
 }
); 

3.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'    
});
 

三丶擁抱ES6,使用Generator特性替代回調函數

相關文章
相關標籤/搜索