gpt4 book ai didi

javascript - 等待 Promise.reject 或抛出错误以摆脱困境?

转载 作者:搜寻专家 更新时间:2023-10-31 23:50:42 25 4
gpt4 key购买 nike

我正在将我的 promise 链接代码重构为异步/等待样式。这样做的原因之一是我想要一个 catch block 来处理所有错误情况(如此处解释 Understanding promise rejection in node.js )

我的问题是,当我遇到同步错误时,我应该调用 await Promise.reject 还是 throw error 来摆脱这个过程?我知道这两种方法都行得通,但我更喜欢 throw error。我已经知道我的结果无效,为什么还要等待?使用 throw 立即终止控制流似乎是一个更好的选择。

我不是在谈论 promise 链(我的问题的全部要点),所以我不认为线程 JavaScript Promises - reject vs. throw回答了我的问题。

我读了文章Error Handling in Node.js我认为它也没有给出答案。但它确实说了

A given function should deliver operational errors either synchronously (with throw) or asynchronously (with a callback or event emitter), but not both. ... In general, using throw and expecting a caller to use try/catch is pretty rare...

我的异步函数可能会返回 Promise.reject。因此,我很关心引入 2 种传递错误的方法,正如那篇文章所反对的那样。

try {
let result = await aysncFunc().
if (!isResultValid(result)) { //isResultValid() is sync function
await Promise.reject('invalid result')
//or throw 'invalid result'
}
... //further processing
}
catch (error) {
...
}

最佳答案

在 promise 控制流中使用 throw 在语义上是正确的,这通常是摆脱 promise 链的首选方式。

根据编码风格,await Promise.reject(...) 可用于区分实际错误和预期的拒绝。带有字符串原因的拒绝 promise 是有效的,但 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');

I am not talking about the promise chain(the whole point of my question), so I don't think the thread JavaScript Promises - reject vs. throw answered my question.

async 函数是 promise 链的语法糖,因此所有适用于 promise 的点也适用于 async

可能存在抛出错误与拒绝 promise 不同的情况,但它们特定于其他 promise 实现,如 AngularJS $q 并且不影响 ES6 promise 。 Promise 构造函数中的同步错误导致异常,这也不适用于 async

关于javascript - 等待 Promise.reject 或抛出错误以摆脱困境?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50575613/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com