收到Error对象时如何停止函数?

时间:2015-02-24 18:42:08

标签: node.js meteor error-handling callback asynccallback

如何在发生错误时停止该功能。

我正在进行http post电话会议。我构建了一个错误优先的样式回调函数。

如果在其中传递了Error对象,如何停止回调函数?在我的用例中,无论错误类型如何,我都需要停止,因为我需要后续回调函数链的数据对象。

只是return吗?我已经阅读了更高级别的返回操作,因此希望确认我的代码是否适合我想要实现的目标。

我只是想确保进行中的回调函数不会继续,因为它们不会传递任何数据对象,因此,都将是'错误'

server.js

var request = function(callback) {
  // HTTP call to server
      },  
      function (error, response, body) {    
      if (!error && response.statusCode === 200) {
        // processed and created data object
          return callback(null, data)
      }
      else {
         console.log(error.stack)
         return callback(error) ;
      }
    })
};
var requestSync = Meteor.wrapAsync(request);


var callback = function(error, data, callback) {
  if (error) {
    // How do I properly stop this function?
     return callback(new Error('custom message I send to client'))
  }
  else {
    // doing something with data object..
  }
}

在我的方法中调用函数。

try {
  var resultOne = requestSync()
  var resultTwo = callback(resultOne)
  // more async callback functions will reside here
} catch (e) {
  console.error('error occured somehwere = ' + e);
} finally {
//
}

2 个答案:

答案 0 :(得分:1)

之前我还没有看到过这种编码方式,所以如果这是正确的方法,如果不了解你真正想做的事情,就很难评论。我假设块:

try {
  var resultOne = requestSync()
  var resultTwo = callback(resultOne)
  // more async callback functions will reside here
} catch (e) {
  console.error('error occured somehwere = ' + e);
} finally {
}

...呼叫另一个"回调"函数比第一个代码片段(或者你将resultOne作为第一个参数传递,并且回调函数将其读作有效的错误对象并抛出错误)。

但是,如果代码将继续运行,如果其中一个函数抛出错误,则回答您的问题,答案是否定的 - 它将直接转移到catch块。看看:this documentation at MDN

特别是这部分:

  

catch子句包含一些语句,用于指定在try块中抛出异常时要执行的操作。也就是说,您希望try块成功,如果它不成功,您希望控件传递给catch块。如果try块中的任何语句(或在try块内调用的函数中)抛出异常,则控制立即转移到catch子句。如果try块中没有抛出异常,则跳过catch子句。

我希望这能回答你的主要问题。由于您似乎在Meteor.wrapAsync()中包装所有异步调用,因此如果正确实现,它们应该在调用下一个函数之前等待返回结果。我可以推荐to have a look at this answer,以获取有关实现wrapAsync和处理错误的正确方法的更多信息。

<强>更新

我觉得这样做很有意思,因为这个帖子已经很久了。看看this example i uploaded to Github,它可能会为您提供所需的答案。

  

&#39;错误&#39;从http调用返回的对象始终被识别为错误对象?

嗯,fiber / future假定标准节点回调作为最后一个参数,错误对象作为第一个参数,结果对象作为第二个参数。只要是这种情况,错误就会被捕获到&#34; catch&#34;阻止,执行将停止。

  

如果是这样,我如何追加另一个字段,以便错误对我有意义?

不完全没有你想到的,但是看看我在Github上的例子。在那里我创建了一个错误对象。如果您不使用setTimeout(我只是模拟异步调用),以相同的方式构造您的函数,从远程调用中捕获错误对象,向其追加一个字段或将err.message更改为对您更有意义的事物,然后调用回调我认为应该可以工作,但我还没有测试过。

  

如果有错误但没有传递错误对象,那么创建一个我可以返回的错误对象的节点约定是什么?

再次查看示例。 wrapAsync仅在服务器上工作,它假定您调用它的函数具有回调作为最后(或唯一)参数。该回调应该有一个错误作为第一个参数,结果作为第二个参数。大多数节点功能(如果不是全部)将符合这些规则。

如果由于某种原因想要自己处理回调,你需要让shure手动调用回调,然后传入&#34; null&#34;作为第一个参数,如果没有错误,或创建一个错误对象,并将其作为第一个参数传入,如果有错误。请查看示例中的wrapAsyncTest.js。

答案 1 :(得分:1)

更多的是node.js模式,但这是我使用的:

if (err) return callback(err, null);
console.log("no error here!");
callback(err, result);