如何解决如果我在异步调用中省略了“等待”,操作是否仍将完成?
这是关于Javascript和最新的Node.JS。
我有一个异步操作(在这种特殊情况下,通过Axios库进行HTTP调用,但问题是普遍的)。我不在乎该操作的结果是什么。如果成功-很好。如果失败-无论如何。但是我知道可能需要一段时间才能完成,所以我不能等那么长时间。所以我想“生火忘了”。
现在,第一个想法只是从通话中删除await
。我会得到一个Promise
,我很快就忘记了,该操作将按照自己的条件完成。我认为这应该可行,但是...有点不对劲。我不能指责它,但是它使我烦恼。
这样安全吗?还是我应该坚持使用Promise
并在计时器或其他方式下检查其结果,即使我不会对它们进行任何操作?
解决方法
如果您对成功的HTTP请求通知不感兴趣,则仍然必须考虑到HTTP请求由于某种原因而失败(服务器没有响应,没有Internet连接,...)时会发生什么。>
您不需要保留一个Promise对象,甚至不需要async
,但是您至少应该处理一个Promise拒绝,否则您将得到“未处理的Promise拒绝” “例外。
这样做:
fetch(url).catch(err => { /* deal with error */ });
如果您也不关心该错误(我对此表示怀疑),则可以这样做:
fetch(url).catch(Boolean);
这样,您将获得永远不会拒绝的承诺。因此您可以忽略它。
,如果我理解得很好, then 和 catch 是您最好的选择:
myPromise
.then(whatever => /* do whatever non-blocking operation you want */)
.catch(error => /* deal with error if any */);
// you code here is not blocked by the promise
,
在您的函数中,您在await
语句之后编写的所有内容都将放入队列,以在异步过程完成后执行。这样,node js便可以保持事件循环自由,以运行其他任何代码。
我的意思是
async function getName() {
const name = await db.getName();
console.log(name); // <--- this will put into a queue to execute after above line completed
}
因此从技术上讲,如果您不希望在上一行结束之前等待执行console.log(name)
,则只需删除await
关键字
function getName() {
db.getName(); // <-- you don't even need to store it to a variable
console.log(name);
}
以上功能为100%同步。但是,您必须捕获该错误,否则,如果失败,则js会抛出未处理的承诺拒绝错误。因此,您可以轻松地像下面这样
function getName() {
db.getName().catch(err => undefined); // <-- you don't even need to store it to a variable
console.log(name);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。