2012-11-28 91 views
3

我有兩個功能:什麼是async.series的簡單實現?

function one(next){ 
    Users.find({}, function(err, docs){ 
    if(err) 
     next(err); 
    } else { 
     next(null); 
    } 
    }); 
} 

function two(next){ 
    Something.find({}, function(err, docs){ 
    if(err) 
     next(err); 
    } else { 
     next(null); 
    } 
    }); 
} 

我可以使用異步庫:

async.series([one, two], function(err){ 
    ... 
}); 

這裏,回調馬上打電話(與ERR集),如果一個()返回時走錯了路。 什麼是easy,async.series的基本實現? 我看了庫async(這太棒了)的代碼,但它是一個圖書館,意味着做了很多的東西,我遇到了麻煩。

你能告訴我一個簡單的async.series實現嗎?它會簡單地調用一個接一個的函數,並且 - 如果其中一個調用帶有錯誤的回調函數 - 調用最終回調函數err set?

謝謝...

芝加哥商業交易所。

回答

5

一個實現將是這樣的:

function async_series (fn_list, final_callback) { 
    // Do we have any more async functions to execute? 
    if (fn_list.length) { 
     // Get the function we want to execute: 
     var fn = fn_list.shift(); 
     // Build a nested callback to process remaining functions: 
     var callback = function() { 
      async_series(fn_list,final_callback); 
     }; 
     // Call the function 
     fn(callback); 
    } 
    else { 
     // Nothing left to process? Then call the final callback: 
     final_callback(); 
    } 
} 

上面的代碼沒有處理結果或錯誤的處理。爲了處理錯誤,我們可以簡單地檢查錯誤條件回調,並立即撥打最終回調的錯誤:

function async_series (fn_list, final_callback) { 
    if (fn_list.length) { 
     var fn = fn_list.shift(); 
     var callback = function (err) { 
      if (err) { 
       final_callback(err); // error, abort 
      } 
      else { 
       async_series(fn_list,final_callback); 
      } 
     }; 
     fn(callback); 
    } 
    else { 
     final_callback(null); // no errors 
    } 
} 

處理結果同樣可以通過在封閉的結果陣列的任跟蹤完成,或者將它傳遞到下一次調用async_series。

請注意,最終的最終回調可以假定沒有錯誤,因爲它通過if(err)(else)async_series呼叫到達那裏。

+1

AAaaaahhhhhhhhhhhhhhh我明白了,100%。哇謝謝你_。我小小的腦袋想着'next'參數必須成爲下一個回調......但是不是!它需要是一個快速的功能,只是繼續工作!很明顯,一旦你看到它......謝謝你! – Merc

+1

它確實需要一些習慣於編寫面向事件的代碼。但是一旦你習慣了傳遞和返回函數(我的意思是非常適應它,而不僅僅是理解它),一切都有意義,並且你不再考慮if..else和loop。 – slebetman

+1

任何提示「加快舒適度」的提示?我覺得我真的很努力... – Merc

相關問題