[英]Is it any way to throw errors inside promises in node.js?
js古魯斯
我正在用nodejs(實際上是iojs)編寫一個解析器,並且我有一個典型的以承諾處理的厄運回調金字塔。 花了我70%的時間的問題是在承諾中發現錯誤。
function parseHomeData(home, web) {
var deferred = Q.defer();
var homepage = web.url(home).then(function () {
// any error here dies silently
parser.getHomeInfo(homepage).then(function (parsedHome) {
console.log(parsedHome);
deferred.resolve(parsedHome);
}, function (err) {
console.log(err);
throw new Error(err);
});
}, function (err) {
console.log(err);
});
return deferred.promise;
};
如果我不評論“這里的任何錯誤都悄無聲息地消失了”,它將成功。 唯一的方法是將try / catch塊包裝起來,但是即使在那里,我也只能console.log(error)拋出新錯誤。 是否可以通過自動失敗選項運行iojs? 謝謝
承諾捕獲異常並將其變為拒絕。 因此,如果您在.then()
處理函數中並且拋出異常,則該異常將產生與返回拒絕的諾言相同的結果。 這就是諾言的工作方式。
因此,要使代碼正常工作,您只需要返回web.url()
正在創建的實際承諾web.url()
。 這也將擺脫不必要的一些反模式,而這些模式在您不必要地創建諾言的地方。
function parseHomeData(home, web) {
return web.url(home).then(function () {
// any exception error here becomes the rejected promise
return parser.getHomeInfo(homepage).then(function (parsedHome) {
console.log(parsedHome);
return parsedHome;
}, function (err) {
// this handler is only needed if you need the console.log(err) here
console.log(err);
throw new Error(err);
});
}, function (err) {
// this handler is only needed if you need the console.log(err) here
console.log(err);
throw err;
});
};
實際上,如果沒有console.log()
語句,則所有代碼都可能會崩潰:
function parseHomeData(home, web) {
return web.url(home).then(parser.getHomeInfo.bind(parser));
}
此代碼塊結合了幾件事:
返回web.url()
承諾,因此,如果由於任何原因(例如, .then()
處理程序中的拋出.then()
而被拒絕,則將從parseHomeData()
函數中將其作為拒絕的承諾返回。
當您已經有了Q承諾時,無需創建自己的Q承諾就可以返回。
一旦實現了上面的1)和2),那么就可以從.then()
處理程序中返回或拋出,而不是resolve()
和reject()
。
您可以在以下參考資料中了解有關諾言反模式的更多信息:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.