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

如何在发生错误时停止function。

我正在做一个http后的通话。 我已经构造了一个错误优先风格的callback函数。

如果传入一个Error对象,如何停止callback函数? 在我的使用情况下,我需要停止,无论错误types,因为我需要的数据对象的后续链callback函数。

它是否简单地return ? 我已经阅读了更高层次上的回报,希望得到确认,如果我的代码是正确的,我想实现。

我只是想确保继续callback函数不会继续,因为他们不会传递任何数据对象,因此,都将是'错误'

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 { // } 

我之前没有看到过这种编码方式,所以很难评论这是否是正确的方法,而不知道你真正想做什么。 我假设该块:

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

…调用另一个“callback”函数,而不是在第一个代码片段中(否则,您将传递resultOne作为第一个参数,并且callback函数会将其作为有效的错误对象读取并引发错误)。

然而,要回答你的问题,如果代码将继续运行,如果其中一个function抛出一个错误,答案是否定的 – 它会直接转移到catch块。 看看: MDN的这个文档

尤其是这部分:

一个catch子句包含指定在try块中抛出一个exception时要做什么的语句。 也就是说,你希望try块成功,如果不成功,你需要控制权传递给catch块。 如果try块中的任何语句(或者在try块中调用的函数中)引发exception,则控制立即转移到catch子句。 如果在try块中没有引发exception,则跳过catch子句。

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

UPDATE

我认为这是一个有趣的例子,因为这个post已经越来越长了。 看看这个例子,我上传到Github ,它可能会给你你需要的答案。

那么从http调用传回来的'error'对象总是被认为是一个错误对象?

那么,fiber / future会假设一个标准的节点callback函数作为最后一个参数,第一个参数是错误对象,第二个参数是结果对象。 只要是这种情况,错误就会被捕获,并停止执行。

如果是这样,我怎么能追加另一个领域,所以这个错误对我有意义?

不能确切地说你在这里想到什么,但看看我在Github上的例子。 在那里我创build一个错误对象。 如果你不使用setTimeout(我只是模拟一个asynchronous调用),以同样的方式构造你的函数,从远程调用中捕获错误对象,附加一个字段或改变err.message到更有意义的东西,然后调用callback,我认为这应该工作,但我没有testing这一点。

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

再次看到这个例子。 wrapAsync只能在服务器上工作,它假设你调用它的函数有一个callback作为最后一个(或唯一的)参数。 该callback应该有一个错误作为第一个参数,第二个结果。 大多数节点function(如果不是全部的话)将遵守这些规则。

如果由于某种原因想要自己处理callback,则需要手动调用callback函数,如果没有错误,则传入“null”作为第一个参数,或者创build一个错误对象并将其传入第一个参数,如果有错误。 看例子中的wrapAsyncTest.js。

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

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