node.js 中一个常用的异步函数调用习惯用法是这样使用回调函数:
library.doSomething(params, function(err,result) {
if (err) {
... handle error, retry etc
} else {
... process results, be happy!
}
});
太好了 - 你调用一些东西,然后处理结果或错误。不幸的是,排除了第三个选项......您调用的代码永远不会执行您的回调。处理回调永远不会被调用的可能性的最佳方法是什么?
很多时候,特别是如果您正在编写一个依赖于网络的库,您需要保证您将调用一次且仅一次传递给您的任何回调。考虑到这一点,这样的模式看起来像是要走的路:
// set a timout
var failed = false, callbackFailure = setTimeout(function() {
... handle failure, call further pending callbacks with a timeout error
failed = true;
},30000);
library.doSomething(params, function(err,result) {
if (!failed) {
clearTimeout(callbackFailure);
if (err) {
... handle error, retry etc
} else {
... process results, be happy again!
}
}
});
任何你期望触发的回调实际上都会触发,这似乎是一个信仰问题,我相信所有程序员都遇到过回调根本无法执行的场景——宇宙射线、太阳黑子、网络故障、错误第三方库,或者...喘不过气来...您自己的代码中的错误。
像我的代码示例这样的东西实际上是一个很好的实践,还是 node.js 社区已经找到了更好的方法来处理它?