我正在重构我的promise,将代码链接到异步/等待样式。这样做的原因之一是我想要一个catch块来处理所有的错误情况(这里解释了如何理解node.js中的promise拒绝)
我的问题是,当我遇到同步错误时,我是否应该调用等待promise。拒绝
或
抛出错误
以退出该过程?我知道这两种方法都可以,但我更喜欢抛出错误。我已经知道我得到了一个无效的结果为什么我要等待?使用throw立即终止控制流似乎是一个更好的选择。
我不是在谈论promise链(我问题的全部),所以我不认为JavaScriptpromise-拒绝vs.扔这个线程回答了我的问题。
我在Node.js中读到了错误处理这篇文章,我认为它也没有给出答案。但它确实说
给定函数应该同步(通过抛出)或异步(通过回调或事件发射器)传递操作错误,但不能同时传递这两种错误。。。一般来说,使用throw并期望调用方使用try/catch是非常罕见的。。。
我的异步函数可能会返回Promise.reject.所以我担心引入两种方法来传递错误。
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控制流中使用扔
在语义上是正确的,这通常是脱离promise链的优选方式。
根据编码风格,wait Promise.reject(...)
可用于区分实际错误和预期拒绝。带有字符串原因的拒绝promise是有效的,但是抛出无效结果被认为是风格问题,可以用linter规则来解决,因为它通常使用错误
实例作为异常。
它之所以重要,是因为无法使用instanceof Error
检测字符串异常,并且没有message
属性,将一致的错误记录为控制台。warn(Error.message)
将导致模糊的未定义的
条目。
// 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;
}
由于
无效结果
实际上是一个错误,因此合理的做法是:
throw new TypeError('invalid result');
我不是在谈论promise链(我问题的全部),所以我不认为JavaScriptpromise-拒绝vs.扔这个线程回答了我的问题。
async
函数是promise链的语法糖,因此适用于promise的所有点也适用于async
。
在某些情况下,抛出错误与拒绝promise不同,但它们特定于其他promise实现,如AngularJS
$q
,并且不影响ES6promise。Promise
构造函数中的同步错误导致异常,这也不适用于async
。
我正在努力找出以下语法的问题: 我一直得到错误说: 等待是一个保留字 ...但是在异步函数中不合法吗? 调度位来自report-thunk库。
问题内容: 我正在努力用以下语法找出问题所在: 我不断收到错误消息: 等待是保留字 …但是在异步函数中不合法吗? 调度位来自 react-thunk 库。 问题答案: 为了使用,直接封装它的函数需要异步。根据您的评论,添加到内部函数可以解决您的问题,因此我将其发布在这里: 可能的话,您可以从外部函数中删除,因为它不包含任何异步操作,但这取决于该调用者是否期望返回承诺。
在我的Rails 4应用程序中,我有一个对Postgres 9.4数据库的查询: 很受这个相关回答的启发dba.SE. 我只想让我的查询找到并更新第一行(随机地,用< code>LIMIT),其中< code>available = true并将其更新为< code>available = false,我需要在执行此操作的同时锁定该行,但不需要发出新的请求来等待前一个锁的释放,因为有许多并发调用将
我在服务层的spring-boot应用程序中使用了Hystrix(Camden.sr7版本),而没有回退方法。Service的方法之一如下所示: 对于这样的响应,不清楚实际上是从哪个方法抛出异常的。如果我将版本更改为brixton.sr5(以前的版本),它将返回清晰的响应: 因此Hystrix的新版本(实际上是spring-cloud-dependencies的新版本)不会抛出HystrixRun
既然我们可以在Javascript中使用关键字抛出任何东西,那么我们就不能直接抛出一个错误消息字符串吗? 有人知道这里面有什么陷阱吗? 让我对此添加一些背景:在JavaScript世界中,人们通常依赖参数检查而不是使用try-catch机制,因此只使用抛出致命错误是有意义的。不过,为了能够捕捉一些系统错误,我必须为我自己的错误使用一个不同的类,而不是创建错误的子类,我认为我应该只使用String。
我有一种使用猫鼬将产品发布到mongodb的方法。我使用的是异步等待而不是当时的捕获块。我的代码 : 捕获中的错误由我的应用中的快速中间件捕获.js。 这工作正常。在这种特定情况下,当数组“标签”长于5时,我来自Postman(REST API开发工具)的请求返回: 当我尝试在尝试捕获之外使用“如果”检查时,我得到这个错误: 这种在try-catch中抛出错误以检查长度、使用if语句检查空数组的方