2015-02-24 28 views
1

隨着項目的不斷髮展,我們開始有這個大加讚賞,防禦性的代碼片段幾乎無處不在:如果(錯誤)Node.js中的樣板文件有沒有辦法克服回調?

func(err, result){ 
    if(err){ 

     console.log('An error occurred!, @myModule :' + err); 
     return callback(err); 
    } 

    //then the rest.. 
} 

快速谷歌搜索發現一些庫試圖克服這一共同關注,例如https://www.npmjs.com/package/callback-wrappers

但是,在不影響早期錯誤處理機制的情況下,最小化樣板編碼的最佳方法是什麼?

+0

使用承諾:https://www.promisejs.org/ – mbcrute 2015-02-24 14:18:40

回答

2

有幾種方法可以幫助緩解這個問題,都使用外部模塊。

首先,我的首選方法是使用async,特別是async.series,async.parallelasync.waterfall。如果在任何異步調用中發生錯誤,這些方法中的每一個都會直接跳到最後一個函數,從而防止在回調期間出現if(err)條件的飛濺。

例如:

async.waterfall([ 
    function(cb) { 
    someAsyncOperation(cb); 
    }, 
    function(result, cb) { 
    doSomethingAsyncWithResult(result, cb); 
    } 
], function(err, result) { 
    if(err) { 
    // Handle error - could have come from any of the above function blocks 
    } else { 
    // Do something with overall result 
    } 
}); 

另一種選擇是使用一個承諾庫,如q。這有一個功能Q.denodeify可幫助您將回調式代碼包裝爲承諾樣式。有了承諾,你用.then..catch.done

var qSomeAsyncOperation = Q.denodeify(someAsyncOperation); 
var qDoSomethingAsyncWithResult = Q.denodeify(doSomethingAsyncWithResult); 

Q() 
    .then(qSomeAsyncOperation) 
    .then(qDoSomethingAsyncWithResult) 
    .done(function(result) { 
    // Do something with overall result 
    }, function(err) { 
    // Handle error - could have come from any of the above function blocks 
    }); 

我更喜歡使用async因爲它更容易理解正在發生的事情,它是更接近真正的回調風格的Node.js已通過。

+0

感謝您的答案!我們已經使用異步,但是仍然會有很多if(err)檢查,因爲解耦函數和模塊的數量會增加。 – 2015-02-25 09:43:18

相關問題