有趣的callback

這是一個簡單的問題,若是你對async已經很是熟悉了,那就不要看了。javascript

最初的代碼是這樣的:java

var async=require('async');
async.parallel([function(callback){
    callback(null);
},function(callback){
    callback(null);
}],function(err){
    console.log("我是parallel的callback");
});

執行結果爲:異步

我是parallel的callbackasync

雖然兩處都調用了callback,可是callback只執行了一次。

在parallel的第一個方法中加入一個waterfall函數

var async=require('async');
async.parallel([function(callback){
    async.waterfall([function(callback){
        callback(null,"abc");
    },function(arg1,cb){
        console.log("waterfall第一個函數傳來的參數爲:"+arg1);
        callback(null,"bgd");
    }],function(err,restult){
        console.log("我是waterfall的callback");
        console.log("執行的最終結果是:"+restult);        
    });
    //callback(null);
},function(callback){
    callback(null);
}],function(err){
    console.log("我是parallel的callback");
});

執行結果爲:ui

waterfall第一個函數傳來的參數爲:abc
我是parallel的callbackrest

可見,此時在waterfall中調用callback依舊是調用的parallel中的callback。code

並且將上述代碼中的註釋行取消註釋,則會報一個重複調用callback的錯誤。

替換waterfall中的callback爲cb。ip

var async=require('async');
async.parallel([function(callback){
    async.waterfall([function(cb){
        cb(null,"abc");
    },function(arg1,cb){
        console.log("waterfall第一個函數傳來的參數爲:"+arg1);
        cb(null,"bgd");
    }],function(err,restult){
        console.log("我是waterfall的callback");
        console.log("執行的最終結果是:"+restult);        
    });
    callback(null);
},function(callback){
    callback(null);
}],function(err){
    console.log("我是parallel的callback");
});

執行結果:io

我是parallel的callback
waterfall第一個函數傳來的參數爲:abc
我是waterfall的callback
執行的最終結果是:bgd

有個現象很是有趣:parallel的callback是先執行的,我以爲這種異步仍是要注意一下的。

把callback移到cb裏面去,就OK了,這個比較好理解。

var async=require('async');
async.parallel([function(callback){
    async.waterfall([function(cb){
        cb(null,"abc");
    },function(arg1,cb){
        console.log("waterfall第一個函數傳來的參數爲:"+arg1);
        cb(null,"bgd");
    }],function(err,restult){
        console.log("我是waterfall的callback");
        console.log("執行的最終結果是:"+restult);
        callback(null);        
    });
    
},function(callback){
    callback(null);
}],function(err){
    console.log("我是parallel的callback");
});

執行結果:

waterfall第一個函數傳來的參數爲:abc
我是waterfall的callback
執行的最終結果是:bgd
我是parallel的callback


結論:

在這種異步嵌套異步的狀況下,應該注意callback的命名,區分一下,以防出錯。

相關文章
相關標籤/搜索