javascript - 在异步函数中等待等待多长时间?
问题描述
我想知道,在异步函数中等待等待多长时间 [因此将每个资源保留在 RAM 中]。考虑这个例子:
async function my_func(some_big_sized_data){
let db_input = await gettingDBinputWhichIsDamnedSlow();
//then do some processing based on db_input and some_big_sized_data
}
现在,如果 DB 一直在回复该怎么办。await 函数将等待并保存所有这些数据 [并在此过程中占用 RAM] 多长时间?是否也有等待超时,或者等待实际上可以无限等待?【如何控制这个超时时间】
解决方案
await
实际上是消耗承诺的语法糖。promise 可以永远挂起,await 也是如此。异步/等待没有内置的超时机制。
例子:
async function foo() {
await new Promise(r => r);
console.log('complete');
}
如果你运行这个 foo 函数,那 await 永远不会解决,所以它永远不会到达console.log('complete')
.
但await
本身并不能支撑 RAM。某些资源是留在 RAM 中还是被 GC'ed 是由引用计数决定的,这种机制与await
.
我说异步/等待没有内置的超时机制。但是,由于它只是 Promise 的语法糖,您可以将您的gettingDBinputWhichIsDamnedSlow
Promise 包装在另一个 Promise 中以手动创建临时超时控制。
await new Promise((resolve, reject) => {
const timeoutId = setTimeout(() => {
reject(new Error('timeout'))
}, 10000) // wait 10 sec
gettingDBinputWhichIsDamnedSlow().then(value => {
clearTimeout(timeoutId)
resolve(value)
})
})
推荐阅读
- list - 将 selected="selected" 更改为选项列表中的第一个值
- azure - Azure DevOps 发布包含已修改文件列表的电子邮件通知(提交日志)
- vmware - 尽管 VMWare 环境中端口组的 VLAN ID 错误,但带有 VLAN 标记的镜像流量仍然通过
- python-3.x - 当 conda 说安装了 1.20.1 时,为什么 Python 会在我的 dask 环境中加载 numpy 1.20.0?
- spring-boot - NameNotFound 异常:Spring Boot (2.2.7.RELEASE)、嵌入式 Tomcat、JNDI - WebSphere MQ
- java - RabbitListenerTestHarness 的问题,它不起作用
- javascript - 递归创建对象时如何保留孩子的父ID?
- node.js - Nodejs 提供多个文件和 JSON 数据
- reactjs - Next.js 基于选中项渲染组件
- jquery - Laravel - 如何将 jQuery 插件添加到 .vue 视图?