1. 程式人生 > >nodeJS之async非同步程式設計

nodeJS之async非同步程式設計

本來我是iOS開發工程師,是屬於客戶端的,然後公司需要,涉及一些後臺只知識,所以要學習一下nodeJS。在 學習過程中,有簡單的有困難,不只是在編碼習慣,還有語法上的不嚴謹性,都與iOS存在著差異。接下來說一下,我對async非同步模組的理解。

waterfall : 非同步序列執行(瀑布流)

語法 :async.waterfall([tasks],function);

tasks為一個任務陣列,下面三個序列示例,希望有助於大家的理解。

var async = require('async');
// 1、無錯誤示例,第一個函式中的第二個第三個回撥引數對應傳入下一個函式中的第一個第二個引數,
// null對應的是err的引數,如果第一個函式中第一個引數有值,則意味著執行出現錯誤,會直接執行waterfall的function函式,打印出錯誤資訊,也就是第一個引數的值
// 如果序列執行函式中所有函式的第一個引數為null(為空),則意味著執行正常,輸出最後結果----done
async.waterfall([
    function(callback){
        callback(null,'one', 'two');
    },
    function(arg1, arg2, callback){
        // arg1 == 'one' and arg2 == 'two'
        callback(null, 'three');
    },
    function(arg1, callback){
        /    / arg1 == 'three'
        callback(null, 'done');
    }
],
    function (err,result) {
        if (err) {
            console.log('error',err);
        }else {
            console.log(result);//done
        };
    }
);
// 序列執行錯誤 : two
async.waterfall([
    function(callback){
        callback('two');//err
    },
    function(arg1, arg2, callback){
        callback(null, 'three');
    },
    function(arg1, callback){
        callback(null, 'done');
    }
],
    function (err,result) {
        if (err) {
            console.log('error',err);// two
        }else {
            console.log(result);
        };
    }
);
// 序列執行錯誤 : one
async.waterfall([
    function(callback){
        callback('one', 'two');//err
    },
    function(arg1, arg2, callback){
        callback(null, 'three');
    },
    function(arg1, callback){
        callback(null, 'done');
    }
],
    function (err,result) {
        if (err) {
            console.log('error',err);// one
        }else {
            console.log(result);
        };
    }
);
// 2、parallel :非同步並行執行
// 語法 :async.parallel({tasks},function);
// tasks為一個任務字典,或者說任務物件集合,其中執行順序為並行執行,也就說同時執行,但是最後的返回結果是按照任務順序排序的
// 但是當執行過程中出現錯誤,會直接跳出,然後執行parallel中function函式,
// 其中null的作用與waterfall中null的作用一樣
// 錯誤輸出 one ,正確輸出為 one,two
// 並行執行出現錯誤
async.parallel([
    function(callback){
        // error 
        callback('one');
    },
    function(callback){
        callback(null, 'two');
    }
],
    function(err, results){
        if (err) {
            console.error('err',err);
        }else {
            console.log('results',results);
        }
    }
);


// 並行執行OK
async.parallel([
    function(callback){
        callback(null,'one');
    },
    function(callback){
        callback(null,'two');
    }
],
    function(err, results){
        if (err) {
            console.error('err',err);
        }else {
            console.log('results',results);// one two
        }
    }
);