在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中处理错误的方法有很多种:
- 同时采取“成功”和“错误”的callback。
- 采取一个单一的callback来处理“成功”和“错误”的情况。
- 有一个默认的“错误”处理程序的注册机制,使error handling程序在所有其他调用上可选,根据情况使用立即或回退错误callback。
结合:
- 使用没有参数的错误callback。
- 使用布尔值来指示成功/失败。
- 使用string来封装错误的性质。
- 使用一些更复杂的“结果”对象来封装成功/失败和结果。
- 使用一些复杂的对象来封装详细的失败信息。
真的,完全取决于你。 这也取决于你想要做什么。 例如,如果您不打算对失败信息做任何事情,则可能不值得花费构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程序 关注点分离的好例子。