Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 异步函数可以等待多长时间?_Javascript_Async Await - Fatal编程技术网

Javascript 异步函数可以等待多长时间?

Javascript 异步函数可以等待多长时间?,javascript,async-await,Javascript,Async Await,我想知道,在异步函数中等待等待(并因此保持RAM中的所有资源)的时间有多长。 考虑这个例子: 异步函数my\u func(一些大数据){ 让db_input=等待gettingdbinputwichisdamnedlow(); //然后根据db_输入和一些大数据进行处理 } 现在,如果DB永远都在回复呢。 等待函数等待和保留所有这些数据[并在过程中保留RAM]需要多长时间? 等待是否也有超时,或者等待可以无限期地等待?[如何控制此超时时间]您无法为wait设置超时,它将阻止承诺的达成 您可以编

我想知道,在异步函数中等待等待(并因此保持RAM中的所有资源)的时间有多长。 考虑这个例子:

异步函数my\u func(一些大数据){
让db_input=等待gettingdbinputwichisdamnedlow();
//然后根据db_输入和一些大数据进行处理
}
现在,如果DB永远都在回复呢。 等待函数等待和保留所有这些数据[并在过程中保留RAM]需要多长时间?
等待是否也有超时,或者等待可以无限期地等待?[如何控制此超时时间]

您无法为
wait
设置超时,它将阻止承诺的达成

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

来自以下方面的
承诺.race

race()方法返回满足或拒绝的承诺 一旦iterable中的一个承诺实现或拒绝, 具有该承诺的价值或理由

函数gettingdbinputwichisdamnedslow(){
返回新承诺((res,rej)=>setTimeout(res,5000,“来自数据库的数据”);
}
//以毫秒为单位计算超时
函数waitWithTimeout(超时,…args){
函数超时(){
返回新的承诺((res,rej)=>setTimeout(rej,timeout,newerror(`timeout out after${timeout}ms`));
}
return Promise.race([…args,timeOut()]);
}
异步函数my\u func(一些大数据){
设db_input=null;
试一试{
db_input=wait waitwithtimeout(1000,gettingdbinputwichisdamnedlow());
}捕获(错误){
console.error(error.message);
}
log(“db_输入”,db_输入);
}

我的函数()
await
实际上是一种使用承诺的语法糖。承诺可以永远等待,等待也是如此。异步/等待没有内置超时机制

例如:

async function foo() {
  await new Promise(r => r);
  console.log('complete');
}
如果运行这个foo函数,wait将永远无法解决,因此它永远不会到达
console.log('complete')

但是,
await
本身并不占用RAM。一些资源是留在RAM中还是得到GC’ed取决于引用计数,这种机制与
wait
无关

我说过异步/等待没有内置超时机制。但是,由于它只是promise的语法糖,您可以将您的
gettingdbinputwichisdamnedslow
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)
  })
})

基本上,永远。而且,
wait
不会挂起任何东西。也请检查此链接。可能会有帮助:关于第一个示例,虽然由于setInterval回调,
count
确实不能被GCed,但两个承诺都可以,没有任何东西可以引用它。