如何在发生错误时停止该功能。
我正在进行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 {
//
}
答案 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);