nodejs waterfall的使用


waterfall(tasks, [callback]) (多個函數依次執行,且前一個的輸出為后一個的輸入)

按順序依次執行多個函數。每一個函數產生的值,都將傳給下一個函數。如果中途出錯,后面的函數將不會被執行。錯誤信息以及之前產生的結果,將傳給waterfall最終的callback。

對於學過了js回調機制的小伙伴,waterfall是比較容易理解的,個人的理解就是,waterfall中傳入的函數數組tasks中,后一個函數為前一個函數的回調,使用cb(null,args),這樣的形式調用下一個函數,如果出現異常,則直接使用cb(new Error("錯誤的信息"))這樣的方式來捕捉異常,並調用最終的回調函數來處理,在這種情況下,出現異常的函數后面那些函數,將不再繼續執行,測試代碼如下:

var async = require('async'); var a = 10; async.waterfall([ function(cb) { console.log("getb") setTimeout(function() { if (a == 0) { cb(new Error("a不能為0")); } else { var b = 1 / a; cb(null, b); //在這里通過回調函數把b傳給下一個函數,記得一定要加上null,才能調用數組中得下一個函數,否則,會直接調用最終的回調函數,然后結束函數,則后面的函數將不再執行 //如果這里寫成cb(b); //結果會變成: /** *getb *0.1 **/ } }, 1000); }, function(b, cb) { setTimeout(function() { console.log("getc") var c = b + 1; cb(null,c); }, 1000); } ], function(err, result) { if (err) { console.log(err); } else { console.log('c:' + result) } }); 

當a = 0時,會直接拋出錯誤,輸出如下:
getb
Error: a不能為0
先執行了第一個函數,在第一個函數中拋出異常之后,直接執行最終的回調函數,並沒有接着執行第二個函數。
a = 10 時,輸出如下:
getb
getc
1.1
先執行了第一個函數,然后把第一個函數算出的b傳給了第二個函數,再次算出第二個函數中得C,傳給最終的結果result。

 


免責聲明!

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



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