【问题标题】:How long can await wait in an async function?异步函数中的 await 可以等待多长时间?
【发布时间】:2020-04-15 13:38:57
【问题描述】:

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

【问题讨论】:

标签: javascript async-await


【解决方案1】:

await 实际上是消耗承诺的语法糖。 promise 可以永远挂起,await 也是如此。 async/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)
  })
})

【讨论】:

  • 关于第一个例子,虽然count确实因为setInterval回调不能被GC,但是两个Promise都可以,没有任何引用它。
【解决方案2】:

await 无法超时,只要 Promise 需要得到解决,它就会阻塞。

您可以编写自己的函数来获取超时行为,只需使用Promise.race API。

来自docsPromise.race

Promise.race() 方法返回一个履行或拒绝的承诺 一旦迭代中的一个承诺完成或拒绝, 与该承诺的价值或理由。

function gettingDBinputWhichIsDamnedSlow() {
  return new Promise((res, rej) => setTimeout(res, 5000, "data from db"));
}

//takes timeout in ms
function awaitWithTimeout(timeout, ...args) {
  function timeOut() {
    return new Promise((res, rej) => setTimeout(rej, timeout, new Error(`Timed out after ${timeout}ms`)));
  }
  return Promise.race([...args, timeOut()]);
}

async function my_func(some_big_sized_data) {
  let db_input = null;
  try {
    db_input = await awaitWithTimeout(1000, gettingDBinputWhichIsDamnedSlow());
  } catch (error) {
    console.error(error.message);
  }
  console.log("db_input", db_input);
}

my_func();

【讨论】:

    猜你喜欢
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多