javascript回调中错误参数的更正确位置是什么?

Jos*_*eph 7 javascript browser coding-style node.js

我正在编写一个需要回调的javascript函数.如果出现问题,回调将传递一个错误参数.

什么是最好/最标准的呼叫约定?

  • 回调的错误参数应该是第一个还是最后一个?
  • 我应该传递一个'errorMsg'字符串还是一个new Error('errorMsg')对象?

即,更正确的是 - 这段代码:

foo = function(bar, callback) {
  ...
  if (error) {
    callback('troz not found');
  } else {
    callback(null, result);
  }
}
Run Code Online (Sandbox Code Playgroud)

或者这段代码:

foo = function(bar, callback) {
  ...
  if (error) {
    callback(null, 'troz not found');
  } else {
    callback(result);
  }
}
Run Code Online (Sandbox Code Playgroud)

或这个:

foo = function(bar, callback) {
  ...
  if (error) {
    callback(null, new Error('troz not found'));
  } else {
    callback(result);
  }
}
Run Code Online (Sandbox Code Playgroud)

如果相关,我的代码将用作NodeJS模块和基于浏览器的JavaScript库.

Roy*_*ker 7

您可以指定两个回调,一个用于成功,一个用于错误,并且两者都封装在一个"回调"参数中.这是有多少Javascript库处理您的需求.

var fooFn = function(bar, callbacks) {
  callbacks = callbacks || {}; //make callbacks argument optional
  ...
  if (error) {
    if (callbacks.error) {
      callbacks.error('troz not found'); //pass the error message as a string
    }
  } else if (callbacks.success) {
    callbacks.success(result);
  }
}
Run Code Online (Sandbox Code Playgroud)

成功和错误功能是可选的.要指定两者,请像这样调用:

fooFn("some bar", {
  success: function(result) {
    //success :-)
  },
  error: function(errorMsg) {
    //error :-(
  }
});
Run Code Online (Sandbox Code Playgroud)

你也可以这样做:

fooFn("some other bar");
Run Code Online (Sandbox Code Playgroud)

如果您愿意,可以展开回调对象以支持其他方案,例如"完成".

  • 这在web JS库中很常见,但在node.js中却不常见. (2认同)

Mic*_*yan 1

您应该为您的图书馆选择一个惯例并坚持下去;否则,它就是任意的。JavaScript 中有许多不同的处理错误的方法:

  1. 同时接受“成功”和“错误”回调。
  2. 采用单个回调来处理“成功”和“错误”情况。
  3. 拥有默认“错误”处理程序的注册机制,使错误处理程序在所有其他调用上都是可选的,并根据需要使用立即或后备错误回调。

结合:

  1. 错误回调不使用任何参数。
  2. 使用布尔值来指示成功/失败。
  3. 使用字符串来封装错误的性质。
  4. 使用一些更复杂的“Result”对象来封装成功/失败和结果。
  5. 使用一些复杂的对象来封装详细的故障信息。

真的,这完全取决于你。这还取决于您想要做什么。例如,如果您实际上并不打算对故障信息执行任何操作,那么可能不值得花费构建/传递该额外信息的费用。但也许您有大量详细的故障信息想要传递给用户或返回给 API 调用者,在这种情况下它很有意义。

选择一个约定,并坚持下去。除此之外,这完全取决于你。