Promise.reject(new Error('Something went wrong'));
或者我应该用一个字符串拒绝:
Promise.reject('Something went wrong');
浏览器行为有什么区别?
Promise.reject(new Error('Something went wrong'));
或者我应该用一个字符串拒绝:
Promise.reject('Something went wrong');
浏览器行为有什么区别?
是的,它绝对应该。字符串不是错误,当您有错误时,通常意味着出现问题,这意味着您会真正享受良好的堆栈跟踪。没有错误 - 没有堆栈跟踪。
就像 try/catch 一样,如果你添加.catch
到抛出的拒绝,你希望能够记录堆栈跟踪,抛出字符串会毁了你。
我在移动设备上,所以这个答案很短,但我真的无法强调它的重要性。在大型 (10K+ LoC) 应用程序中,拒绝中的堆栈跟踪确实在轻松的远程错误搜索和办公室的漫长夜晚之间产生了差异。
我建议仅使用Error
对象(而不是字符串)来发送原因。
代码的其他部分正在生成Errors
内部 Promise 拒绝原因...
如果某些代码失败,则异常返回Error
对象。此外,如果你调用任何不支持 Promise 的外部库,它会Error
在失败时抛出对象。如果 Promise 内部发生上述错误之一,它将被转换为catch
with Error
object。
因此,如果您将使用string
as Promise 拒绝原因,您必须期望捕获可能发生在您的string
(部分代码)或Error
(发生一些一般错误时)。(err.message || err)
因此,当您必须处理错误时,您将不得不在任何地方使用丑陋的代码。