我有这样的代码:
exports.listSavedThreads = function (req, res) {
SavedThread.find({}).exec().then(function (data) {
wat.map();
res.render('home/listSavedThreads');
});
};
wat
是未定义的变量,因此上面的代码不起作用,并且永远不会调用res.render()
,但没有任何内容被打印到控制台,它静默失败,浏览器陷入无休止的加载。
如果我在没有承诺的情况下做同样的事情:
exports.listSavedThreads = function (req, res) {
wat.map();
res.render('home/listSavedThreads');
};
像往常一样,错误被打印到控制台和浏览器。
我能够打印错误的唯一方法是使用 try/catch
:
exports.listSavedThreads = function (req, res) {
SavedThread.find({}).exec().then(function (data) {
try {
wat.map();
res.render('home/listSavedThreads');
} catch(e) {
console.log('Error: ', e);
}
});
};
然后在控制台中我看到:
Error: [ReferenceError: wat is not defined]
显然,我不能把try/catch
放到每个操作中,因为我主要需要错误输出来进行开发,所以我可以看到我的错别字和类似的东西。有没有办法为所有操作输出错误,甚至是异步操作?
当不使用 Promise 进行异步调用时,使用错误优先回调来确保错误得到适当的沟通和处理是常见/最佳实践。这是最常见的方法,在async
等库中大量使用。
由于您在代码片段中使用了 Promise,因此我将提供一种使用 Promise 处理错误的方法。使用 Promise 的最佳理由之一是因为它们提供了开箱即用的出色异常处理。
将.catch()
调用添加到您的承诺链中。承诺中发生的任何错误都将传播到最近的.catch()
处理程序。 .catch()
是在.then()
中提供onRejected
回调函数的替代方法。
MDN 承诺.catch()
文档
Bluebird.js - Why Promises?有一些使用Promises时错误处理的好处的例子。
exports.listSavedThreads = function (req, res) {
SavedThread.find({})
.exec()
.then(function (data) {
wat.map();
res.render('home/listSavedThreads');
})
.catch(function(err) {
//handle errors
});
};
或者,您可以先检查是否定义了wat
,然后再继续并相应地处理该方案。
exports.listSavedThreads = function (req, res) {
SavedThread.find({})
.exec()
.then(function (data) {
if(wat) {
wat.map();
return res.render('home/listSavedThreads');
}
else {
// Handle wat undefined
}
});
};