Node.js - Callback在被命中时不会暂停执行

时间:2015-04-10 16:14:33

标签: javascript node.js callback

我一直在使用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()中使用上述方法。 **

2 个答案:

答案 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
  // ....
}