Promise.reject消息是否应该包含在Error中?
使用本机(ES6) Promise 。 我应该拒绝一个错误 :
Promise.reject(new Error('Something went wrong'));
或者我应该拒绝一个string:
Promise.reject('Something went wrong');
浏览器行为有什么不同?
是的,这绝对是应该的。 一个string不是一个错误 ,当你有错误的时候,通常意味着出了问题,这意味着你真的会喜欢一个好的堆栈跟踪。 没有错误 – 没有堆栈跟踪。
就像try / catch一样,如果将.catch
添加到抛出的拒绝中,则希望能够logging堆栈跟踪,并将string.catch
给您。
我在移动,所以这个答案是相当短的,但我真的不能强调这是多么重要。 在大型(10K + LoC)应用程序中,堆栈跟踪在拒绝方面确实造成了简单的远程bugsearch和办公室漫长的夜晚之间的差异。
我build议只使用Error
对象 (不是string)来发送原因。
理由
代码的其他部分在Promise拒绝原因中生成Errors
…
如果某些代码失败,则exception返回Error
对象。 另外,如果您将调用任何不支持Promise的外部库,它将在出现Error
时抛出Error
对象。 如果上面提到的错误之一发生在Promise中,它将被转换成Error
对象。
因此,如果您将使用该string
作为承诺拒绝原因,则必须期望catch string
(您的代码的一部分)或Error
(发生一些常规错误时)。 所以,当你必须处理错误时,你将不得不使用丑陋的代码(err.message || err)
。