赣南脐橙

keybr

佰草伐

导航

< 2025年1月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8

统计

异步/等待的缺点

 

了解Async / await确实很有用,但是要考虑一些缺点。

异步/等待使您的代码看起来同步,并以某种方式使其行为更加同步。await所有的代码块关键字执行后面,直到承诺履行,正是因为它会与同步操作。它的确允许其他任务在此期间继续运行,但是您自己的代码被阻止了。

这意味着您的代码可能会因大量彼此接连发生的等待的承诺而变慢。每个都await将等待上一个完成,而实际上您想要的是诺言同时开始处理,就像我们不使用异步/等待时所做的那样。

有一种模式可以缓解此问题:通过将Promise对象存储在变量中,然后等待所有这些过程来启动所有的Promise过程让我们看一些证明这一概念的例子。

我们提供了两个示例-slow-async-await.html(请参阅源代码)和fast-async-await.html(请参见源代码)。两者都以自定义的promise函数开始,该函数通过setTimeout()调用伪造异步进程

1
2
3
4
5
6
7
function timeoutPromise(interval) {
  return new Promise((resolve, reject) => {
    setTimeout(function(){
      resolve("done");
    }, interval);
  });
};

然后每个timeTest()函数都包含一个异步函数,等待三个timeoutPromise()调用:

1
2
3
async function timeTest() {
  ...
}

每个人都以记录开始时间,看待timeTest()诺言需要多长时间来结束,然后记录结束时间并报告操作总共花了多长时间而结束:

1
2
3
4
5
6
let startTime = Date.now();
timeTest().then(() => {
  let finishTime = Date.now();
  let timeTaken = finishTime - startTime;
  alert("Time taken in milliseconds: " + timeTaken);
})

timeTest()在每种情况下,功能都不同。

slow-async-await.html示例中,timeTest()如下所示:

1
2
3
4
5
async function timeTest() {
  await timeoutPromise(3000);
  await timeoutPromise(3000);
  await timeoutPromise(3000);
}

在这里,我们只是直接等待所有三个timeoutPromise()呼叫,使每个警报持续3秒钟。随后的每个实例都被迫等到最后一个实例完成-如果运行第一个示例,您将看到警报框报告总运行时间约为9秒。

fast-async-await.html示例中,timeTest()如下所示:

1
2
3
4
5
6
7
8
9
async function timeTest() {
  const timeoutPromise1 = timeoutPromise(3000);
  const timeoutPromise2 = timeoutPromise(3000);
  const timeoutPromise3 = timeoutPromise(3000);
 
  await timeoutPromise1;
  await timeoutPromise2;
  await timeoutPromise3;
}

在这里,我们将三个Promise对象存储在变量中,这具有抵消所有关联对象同时运行的作用。

接下来,我们等待它们的结果-因为所有的诺言基本上都在同一时间开始处理,所以诺言将全部同时履行;当您运行第二个示例时,您将看到警报框报告总运行时间刚刚超过3秒!

您必须仔细测试代码,如果性能开始下降,请记住这一点。

另一个不便之处是您必须将等待的诺言包装在异步函数中。

posted on   佰草伐  阅读(138)  评论(0编辑  收藏  举报

编辑推荐:
· .NET开发智能桌面机器人:用.NET IoT库编写驱动控制两个屏幕
· 用纯.NET开发并制作一个智能桌面机器人:从.NET IoT入门开始
· 一个超经典 WinForm,WPF 卡死问题的终极反思
· ASP.NET Core - 日志记录系统(二)
· .NET 依赖注入中的 Captive Dependency
阅读排行:
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(二):用.NET IoT库
· 几个自学项目的通病,别因为它们浪费了时间!
· 在外漂泊的这几年总结和感悟,展望未来
· .NET 数据拷贝方案选择
· .net工作流elsa-书签
历史上的今天:
2019-10-22 php数组长度怎么获取

keybr

php基础知识

Wood Furniture

点击右上角即可分享
微信分享提示