asyncjs,waterfall的使用


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