在JavaScriptcallback中,错误参数的正确位置是什么?

我正在写一个JavaScript函数,需要callback。 如果出现错误,callback将被传递一个错误参数。

什么是最好的/最标准的调用约定?

  • callback的错误参数应该是第一还是最后?
  • 我应该传递一个'errorMsg'string,或一个new Error('errorMsg')对象?

也就是说,什么是更正确的 – 这个代码:

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

或者这个代码:

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

或这个:

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

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

你应该为你的图书馆select一个习俗,并坚持下去。 否则,这是任意的。 在JavaScript中处理错误的方法有很多种:

  1. 同时采取“成功”和“错误”的callback。
  2. 采取一个单一的callback来处理“成功”和“错误”的情况。
  3. 有一个默认的“错误”处理程序的注册机制,使error handling程序在所有其他调用上可选,根据情况使用立即或回退错误callback。

结合:

  1. 使用没有参数的错误callback。
  2. 使用布尔值来指示成功/失败。
  3. 使用string来封装错误的性质。
  4. 使用一些更复杂的“结果”对象来封装成功/失败和结果。
  5. 使用一些复杂的对象来封装详细的失败信息。

真的,完全取决于你。 这也取决于你想要做什么。 例如,如果您不打算对失败信息做任何事情,则可能不值得花费构build/传递额外的信息。 但是也许你有很多详细的失败信息要传递给用户,或者返回给API调用者,在这种情况下,这很有意义。

select一个惯例,并坚持下去。 除此之外,这完全取决于你。

你可以指定两个callback函数,一个用于成功,一个用于错误,并且都封装在一个“callback”参数中。 这是多lessJavascript库处理您的要求。

 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); } } 

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

 fooFn("some bar", { success: function(result) { //success :-) }, error: function(errorMsg) { //error :-( } }); 

你也可以这样做:

 fooFn("some other bar"); 

如果你喜欢,你可以扩展callback对象来支持其他场景,比如“complete”。

大多数node.js应用程序使用“错误优先”模式或EventEmitter模式。 即:

 // more common if (error) { cb({make:'better'}) } else { cb(undefined, stronger) } 

要么

 // cleaner, perhaps, but more keystrokes var ee = new EventEmitter process.nextTick(function () { ... if (error) { ee.emit('error', {msg:'delicious'}) } else { ee.emit('success', bacon) } }) return ee 

似乎我们在这里缺乏现代化的回应:)

现在你可以使用Promise:

 foo = function (bar) { return new Promise(function (resolve, reject) { ... if (error) { reject('troz not found'); } else { resolve(result); } }); } 

或更简单,如果行动是同步的:

 foo = function (bar) { ... if (error) { return Promise.reject('troz not found'); } else { return Promise.resolve(result); } } 

然后,处理结果:

 foo.then(callback) .catch(errorHandler); 

哪里

 callback = function (result) {...} errorHandler = function (errorMessage) {...} 

所以,如果没有错误的callback(结果)将完成,如果错误errorHandler('troz未find')将完成。

作为额外的好处 – 分别有结果处理程序和error handling程序 关注点分离的好例子。