首页 > 解决方案 > 在异步函数中等待等待多长时间?

问题描述

我想知道,在异步函数中等待等待多长时间 [因此将每个资源保留在 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] 多长时间?是否也有等待超时,或者等待实际上可以无限等待?【如何控制这个超时时间】

标签: javascriptasync-await

解决方案


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 的语法糖,您可以将您的gettingDBinputWhichIsDamnedSlowPromise 包装在另一个 Promise 中以手动创建临时超时控制。

await new Promise((resolve, reject) => {
  const timeoutId = setTimeout(() => {
    reject(new Error('timeout')) 
  }, 10000) // wait 10 sec

  gettingDBinputWhichIsDamnedSlow().then(value => {
    clearTimeout(timeoutId)
    resolve(value)
  })
})

推荐阅读