最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - How long can await wait in an async function? - Stack Overflow

programmeradmin3浏览0评论

I wanted to know , how long will await wait [and hence keeps every resource in RAM] in an async function. Consider this example:

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
}

Now what if DB keeps taking forever in replying. How long will await function wait and hold all those data [and hold up RAM in the process]? Is there a timeout of await too , or await can wait pratically infinitely ? [how to control this timeout time]

I wanted to know , how long will await wait [and hence keeps every resource in RAM] in an async function. Consider this example:

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
}

Now what if DB keeps taking forever in replying. How long will await function wait and hold all those data [and hold up RAM in the process]? Is there a timeout of await too , or await can wait pratically infinitely ? [how to control this timeout time]

Share Improve this question asked Apr 15, 2020 at 2:26 Anurag VohraAnurag Vohra 1,9731 gold badge17 silver badges34 bronze badges 3
  • 4 Basically, forever. – Pointy Commented Apr 15, 2020 at 2:32
  • 4 Also the await doesn't hold up anything. – Pointy Commented Apr 15, 2020 at 2:33
  • 1 Check this link too. Might help : stackoverflow.com/questions/36587789/… – LearningEveryday Commented Apr 15, 2020 at 2:39
Add a comment  | 

2 Answers 2

Reset to default 13

await is practically a syntax sugar to consume promise. And promise can stuck pending forever, so does await. There's no builtin timeout mechanism for async/await.

Example:

async function foo() {
  await new Promise(r => r);
  console.log('complete');
}

If you run this foo function, that await is never gonna resolve, so it never reaches console.log('complete').

But await per se doesn't hold up RAM. Whether some resources stay in RAM or got GC'ed is determined by reference count, such mechanism is not related to await.

I said there's no builtin timeout mechanism for async/await. However, since it's just syntax sugar for promise, you can wrap your gettingDBinputWhichIsDamnedSlow promise within another promise to create ad hoc timeout control manually.

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

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

There is no way you can have a timeout for await, it would block as long as the Promise takes to get settled.

You can write your own function to get the timeout behavior, by simply using the Promise.race API.

The Promise.race from the docs:

The Promise.race() method returns a promise that fulfills or rejects as soon as one of the promises in an iterable fulfills or rejects, with the value or reason from that promise.

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();

发布评论

评论列表(0)

  1. 暂无评论