使用它在语义上是正确的
throw
在承诺控制流程中,这通常是摆脱承诺链的首选方法。
根据编码样式,
await Promise.reject(...)
可用于区分实际错误和预期拒绝。带字符串原因的拒绝承诺有效,但
throw 'invalid result'
被认为是可以解决的风格问题
linter rules
因为它是传统的
Error
实例作为异常。
之所以重要,是因为字符串异常不能用
instanceof Error
而且没有
message
属性,一致性错误日志记录为
console.warn(error.message)
会导致模糊
undefined
条目。
// ok
class Success extends Error {}
try {
throw new Success('just a friendly notification');
} catch (err) {
if (!(err instanceof Success)) {
console.warn(err.message);
throw err;
}
}
// more or less
const SUCCESS = 'just a friendly notification';
try {
await Promise.reject(SUCCESS);
} catch (err) {
if (err !== SUCCESS)) {
console.warn(err.message);
throw err;
}
}
// not ok
try {
throw 'exception';
} catch (err) {
if (typeof err === 'string') {
console.warn(err);
} else {
console.warn(err.message);
}
throw err;
}
自从
invalid result
实际上是一个错误,合理的做法是:
throw new TypeError('invalid result');
我不是在谈论承诺链(我问题的全部要点),所以我不认为javascript承诺-拒绝和抛出线程回答了我的问题。
async
函数是承诺链的语法糖,因此适用于承诺的所有点都适用于
异步的
也。
有些情况下,抛出错误可能与拒绝承诺不同,但它们特定于其他承诺实现,如AngularJS。
$q
不要影响ES6承诺。同步误差
Promise
构造函数导致异常,这也不适用于
异步的
.