使用errback有什么好处?

Aad*_*hah 5 javascript callback

程序员似乎对如何异步通知错误感到分歧.

一些程序员喜欢使用带有两个参数的回调:一个值和一个布尔值,它告诉该值是否错误.这样做的好处在于它看起来像一个try catch声明:

asyncFunct(function (value, noError) {
    if (noError) {
        // success, do something with value
    } else {
        // value is the error which is thrown
    }
});
Run Code Online (Sandbox Code Playgroud)

其他人更喜欢负面(即布尔值应该判断该值是否错误).他们的理由是,如果您知道异步函数永远不会抛出错误,那么您可以安全地省略第二个参数,如下所示:

asyncFunction(function (value, isErroneous) {
    if (!isErrorneous) {
        // success, do something with value
    } else {
        // value is the error which is thrown
    }
});

asyncFunction(function (value) {
    // success, do something with value
});
Run Code Online (Sandbox Code Playgroud)

然后有人提出单独的回调以成功执行异步函数和错误执行异步函数的错误.这允许程序员选择是否要处理回调,错误,两者或两者:

asyncFunction(function (value) {
    // success, do something with value
}, function (error) {
    // handle the error
});

asyncFunction(function (value) {
    // success, do something with value
});

asyncFunction(null, function (error) {
    // handle the error
});
Run Code Online (Sandbox Code Playgroud)

我不是问你喜欢哪种方法.我只是想问一下每种方法的优点和缺点,以便我知道何时使用哪种方法.

Sam*_*rek 1

设计决策:

这只是设计决策,仅此而已。如果它是独立参数,您可以拥有独立函数并创建“更漂亮”的代码(对于某人 - 对于某人来说它更混乱 - 这真的很主观)。

错误复杂度:

在某些应用程序中,您可能会遇到更复杂的错误(filesystem.fileRead可能有 FILE_DONT_EXISTS、FILE_LOCKED、NOT_PERMISSIONS..),而在某些应用程序中,您只需要抛出错误(db.checkConnectiondb.openConnection)。

顺序和区别:

很棒的 AP​​I 的非常好的示例来自 Amazon,您可以查看它。http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html

响应:在像回调函数这样的异步函数上,copyObject(params = {}, callback)它始终有 2 个参数:err (Error)和。错误的设计类似于第一个参数,因为如果出现错误,则没有数据。所以这实际上是关于优先级和顺序的。data (Object)function(err, data) { ... }

// request

getObject({
   param1 : something,
   param2 : something,
   param3 : something
}, callback);

// response

function callback(error, response){
   if error throw err;
   // now deal with responsei
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,你们都混合了两种方式。在请求中,您传递对象和函数,作为响应,您会得到错误和对象(到该请求函数)。