我一直在使用node.js开发一个应用程序,在极少数情况下回调并不会在执行时停止执行并继续执行
方法1
utilityMethod(arg1, arg2, arg2,function(err,result){
if(err){
callback(err);
}
if(result){
callback(null,result);
}
else{
callback('an error');
}
});
function utilityMethod(arg1, arg2, arg3, callback){
//some logic
if(err){
return callback(err);
}
else{
return callback(null,'success');
}
}
所以我使用下面的代码(方法2)来暂停执行
方法2
utilityMethod(arg1, arg2, arg2,function(err,result){
if(err){
return callback(err);
}
if(result){
return callback(null,result);
}
else{
return callback('an error');
}
});
我不确定方法1失败的原因。哪一个是正确的使用方式? 方法1失败的原因也是什么?
**注意:我在async.each()中使用上述方法。 **
答案 0 :(得分:0)
方法1的错误是您的if(err)
子句中没有 return 语句,因此您的回调方法会被调用两次。
如果你真的想要暂停程序的执行,你应该在这里做什么是抛出异常
Model.find().exec(function(err,result) {
if(err) {
throw new Error(err);
}
// .. do what you want with the result ..
});
答案 1 :(得分:0)
要退出功能,您需要使用return
。来自documentation:
在函数中调用return语句时,将停止执行此函数。如果指定,则将给定值返回给函数调用者。如果省略表达式,则返回undefined。
所以Model2是正确的方法,虽然可以稍微清理一下:
Model.find().exec(function(err, result) {
if (err) { return callback(err); } // will exit here if error
// no need to explicitly return here as it's the termination of the function
callback(null, result); // result could be null but callback can handle that
});
除非您在此功能中执行某些操作,否则只需使用以下命令即可将此逻辑推送到callback
:
Model.find(callback);
function callback(err, result) {
if (err) {
// do something with err
}
// do soemthing with result
// ....
}