错误或错误作为第一个参数的不同回调?


12

几天前,我们(和JS SO聊天室)与@rlemon讨论了他的Little-XHR库有关错误处理的问题。

基本上,我们想确定应该使用哪种错误处理模式:

xhr.get({
    // Some parameters, and then
    success: function(data) {},
    failure: function(data) {}
})

要么:

xhr.get({
    // Some parameters, and then
    callback: function(err, data) {}
})

一个更像jQuery,而另一个更像Node。有人说第一种模式使您更多地考虑处理错误。我认为相反,因为您可能会忘记其他回调函数,而参数始终位于第二个模式中。

关于这两种模式有什么意见/优势/缺点吗?


xhr.get({ ... }, function (err, data) {})至少正确地
确定

Answers:


5

真正重要的功能是样式的一致性,因此您可以以相同的样式编写代码,并且可以就如何处理异步情况做出元编程假设。

我个人更喜欢

(err, data)因为这是处理事物的标准方式。它允许功能组合。

例如after.map使用此模式。所以代码像

after.map(["foo.js", "bar.js"], function (fileName, callback) {
    fs.readFile(fileName, function (err, file) {
        callback(err, file)
    })
}, function (err, files) {
    // handle files
})

可以简化为

after.map(["foo.js", "bar.js", fs.readFile, function (err, files) {
    // handle files
})

另一个优点是您可以将回调作为最后一个参数传递

asyncOperation(options, function (err, data) {
    // not nested inside an object literal
})

回调最后方法是一种很好的API熟悉方法。

另一个优点是,您可以轻松地忘记error在对象文字中设置处理程序,或将其设置为某种默认错误处理程序。

当您使用(err, data)它时,会提醒您考虑如何每次都有效地处理此错误。


2

通常,我想记住,显式总是比隐式好。

使用此方法,我通常会使用显式successfailure函数-您在打开代码的那一刻就知道要处理的内容-成功处理成功完成的调用,而错误处理存在问题的调用。

当您去修改该代码时,使用单一方法的替代方法将花费更长的时间阅读。此外,您可能最终会得到这样的结果;

xhr.get({
    callback: function(err, data) {
        if (err) {
            // handle that error somehow
        }
        else {
            // deal with success somehow
        }
    }
})

这样的样板变得无聊,快速。

更不用说,如果您忘记添加此样板,例如,您只是在处理成功,那么输入代码库的新开发人员可能看不到它的问题。但是有了显式的错误/成功回调,他们将能够很快看到您缺少error回调,并开始着手处理该回调,或者至少要弄清楚“嗯,这仅是在处理成功-我必须找到一种处理错误的方法”。它使代码看起来不那么神奇。


很难看到您缺少错误回调,也更容易看到您不处理第一个err参数
Raynos

1

单独的回调

如果xhr.get()呼叫成功,则err是多余的。如果呼叫失败。data是多余的。不要强迫客户端代码检查一个或另一个的状态,不要同时传递两者。

如果事实证明成功可以表示部分成功,请分别指出。失败通常是纾困方案。

我与仅处理成功案例的开发人员一起工作,并且在许多情况下,仅实现成功回调在这种情况下就足够了。对于这种类型的编程,多状态回调将是灾难性的选择,因为它们会假设成功。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.