JavaScript回调错误处理

mat*_*nfu 10 javascript error-handling callback

验证参数并返回函数中的错误是很常见的.

但是,在JavaScript回调函数中,例如:

function myFunction(num, callback) {
  if (typeof num !== 'number') return callback(new Error('invalid num'))
  // do something else asynchronously and callback(null, result)
}
Run Code Online (Sandbox Code Playgroud)

我写了很多像这样的函数,但我想知道是否存在可能有害的东西.因为在大多数情况下,调用者假定这是一个异步函数,并且回调将在函数调用之后的代码之后执行.但是如果某些参数无效,该函数将立即调用回调.因此调用者必须小心处理这种情况,即一个意外的执行序列.

我想听听有关这个问题的一些建议.我应该仔细假设所有异步回调都可以立即执行吗?或者我应该使用类似setTimeout(...,0)的东西将同步事物转换为异步事物.或者有一个我不知道的更好的解决方案.谢谢.

T.J*_*der 5

一个API应当记录,它会调用回调要么同步(像Array#sort)或异步(像Promise#then),然后总是服从,所记录的保证。它不应该混搭。

因此,是的,如果您有一个通常会异步调用回调的函数,则无论它为什么进行调用,它都应始终异步调用它。

jQuery中有一个很好的例子:当jQuery首次添加“ deferred”对象时,如果已解决延迟,则它们将同步调用回调,否则将异步调用。这是许多混乱和错误的根源,这也是为什么ES2015的承诺保证thencatch回调始终被异步调用的部分原因。


如果可能,并且与其余代码库保持一致,请考虑使用Promises而不是简单的回调。承诺为异步操作(以及与同步操作的互操作)提供了非常清晰,简单,有保证的语义和可组合性。