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)