2016-11-10 58 views
0

場景: 我有一堆需要依次更改的firebase數據,如果出現問題,我需要停止進一步處理。nodejs中的async.waterfall問題

策略: 使用async.waterfall。這樣我可以根據需要將變量傳遞給下一次迭代和信號失敗。

問題: 當我有三個或更多的數據項要修改時,我在第二個項目後嘗試做回調時卡住了。

代碼:

var processData = function(<params>) { 
    var funcArray = []; 
    funcArray.push(processItemInitial); 
    for(var i = 0; i < length - 1; i++) { 
    funcArray.push(processItem); 
    } 

    async.waterfall(funcArray, function (err, status) { 
    console.log("status: " + status); 
    console.log("err: " + err); 
    }); 
} 

//uses global variable 
var processItemInitial = function (callback) { 
    productsRef.child(<some var>).child('quantity').transaction(function(data){ 
    if(data != null) { 
     //do stuffs 
    } else { 
     console.log("null data"); 
    } 
    return data; 
    }).then(function() { 
    callback(<params>); 
    }); 
} 

// uses variables passed through call backs 
var processItem = function (<params>) { 
    productsRef.child(<some var>).child('quantity').transaction(function(data){ 
    if(data != null) { 
    //do stuffs 
    } else { 
     console.log("null data"); 
    } 
    return data; 
    }).then(function() { 
    callback(<params>); 
    }); 
} 

回答

1

我讀的問題,只要你想,如果出現錯誤停止執行。異步提供了一個非常好的方法來做到這一點。從文檔:

但是,如果任何的任務傳遞一個錯誤,以自己的回調,不執行下一個功能,而主要的回調會立刻與錯誤稱爲 http://caolan.github.io/async/docs.html#waterfall

你如果出現問題,應該能夠調用callback作爲第一個參數。您可以設置爲if (data != null)箱子所以使用else案件是送callback('No data found for <some var>')

var processItem = function (<params>) { 
    productsRef.child(<some var>).child('quantity').transaction(function(data){ 
    if(data != null) { 
    //do stuffs 
    } else { 
     callback('Data not found for <some var>'); 
     console.log("null data"); 
    } 
    return data; 
    }).then(function() { 
    callback(<params>); 
    }); 
} 

如果缺少數據,是不是你擔心的錯誤,你擔心火力地堡的問題,你可以.catch()錯誤,因爲你使用「Thenable」引用:https://firebase.google.com/docs/reference/js/firebase.Thenable#catch

var processItem = function (<params>) { 
    productsRef.child(<some var>).child('quantity').transaction(function(data){ 
    if(data != null) { 
    //do stuffs 
    } else { 
     console.log("null data"); 
    } 
    return data; 
    }).then(function() { 
    callback(<params>); 
    }).catch(function(error) { 
    // Will exit the waterfall 
    callback(error); 
    }); 
} 
+0

這幫助我在我的代碼調試問題。我收到一個例外,我沒有看到,因爲我沒有捕捉到它。 – Ahsan