JS async庫:parallel, series, waterfall, whilst用法

針對JS的異步機制,JS社區給出了很多不同的解決方案,Async庫便是其中一種,可能也是對於控制異步操作最全面的資源。因爲該庫提供了70個函數,幾乎想所有的運用場景都考慮在內。以下筆者針對四個函數進行講解:

1. parallel

const async = require('async');

const doOne = callback => {
    setTimeout(() => {
        callback(null, 'one');
    }, 1000)
}

const doTwo = callback => {
    setTimeout(() => {
        callback(null, 'two');
    }, 1000)
}

let array = [];
array.push(doOne);
array.push(doTwo);

async.parallel(array, (err, result) => {
    console.log(result);
})

//等待1秒後打印:['one', 'two']

Parallel 函數接受兩個參數,第一個參數可以是數組也可以是對象。裏邊需要包括所有需要並行操作的異步函數,以上圖爲例,筆者將兩個異步函數,setTimeout加入隊列中,然後放入parallel函數內的第一個參數。需要注意的是每個異步函數需要制定一個固定參數callback進行調用。該函數用來檢測任何錯誤信息和最後傳達到parallel第二個參數的result。以上函數的執行結果是在等待一秒之後打印出隊列,裏面包含了‘one’和'two'兩值。如果將以上的array改成一個對象,那result也會是一個對象,並根據傳入的鍵值給結果附上對應的值。

2. series

const async = require('async');

const doOne = callback => {
    setTimeout(() => {
        callback(null, 'one');
    }, 1000)
}

const doTwo = callback => {
    setTimeout(() => {
        callback(null, 'two');
    }, 1000)
}

let array = [];
array.push(doOne);
array.push(doTwo);

async.series(array, (err, result) => {
    console.log(result);
})

//等待2秒後打印:['one', 'two']

以上的代碼和parallel幾乎一樣,唯一改變的是將parallel函數改成series。但執行結果卻從1秒變爲2秒。Series針對數組的順序去調用異步函數,只有當第一個函數執行完成後纔會調用第二個,所以執行時間會延長到2秒。但一般情況下,如果業務邏輯需要幾個異步操作通過順序進行,那麼很有可能排後的函數需要用到先執行函數的結果,而series並沒有給出傳遞參數給下一個函數的功能。在這樣的情況,開發者可以用waterfall來解決;

3. waterfall

const doOne = callback => {
    callback(null, "one");
}

const doTwo = (arg, callback) => {
    console.log(arg);
    callback(null, "two");
}

let array = [];
array.push(doOne);
array.push(doTwo);

async.waterfall(array, (err, result) => {
    console.log(result);
})

//one
//two

跟其他函數不同waterfall會將數組裏第一個函數傳入callback的值傳遞給下一個函數。doTwo裏面的console.log會打印doOne傳入的“one”,而waterfall裏的回調會打印doTwo傳入的“two”。

4. whilst

var count = 0;
async.whilst(
    function() { return count < 10; },
    function(callback) {
        count++;
        console.log(count);
        setTimeout(function() {
            callback(null, count);
        }, 500);
    },
    function (err, n) {
        console.log('done');
    }
);

whilst跟以上三個函數不同,該操作不是針對數組或者對象內的順序進行異步調用,而是針對在某種條件下執行異步操作。whilst接受三個參數,第一個爲判斷函數,只有在該函數返回true時,第二個參數參會執行。第二個參數便是表達核心邏輯的函數。第三個則是第一個參數返回false之後的回調函數。在上面的例子中,whilst控制住了count的打印速度,會在每半秒打印出一次count。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章