异步/等待的缺点
了解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秒!
您必须仔细测试代码,如果性能开始下降,请记住这一点。
另一个不便之处是您必须将等待的诺言包装在异步函数中。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET开发智能桌面机器人:用.NET IoT库编写驱动控制两个屏幕
· 用纯.NET开发并制作一个智能桌面机器人:从.NET IoT入门开始
· 一个超经典 WinForm,WPF 卡死问题的终极反思
· ASP.NET Core - 日志记录系统(二)
· .NET 依赖注入中的 Captive Dependency
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(二):用.NET IoT库
· 几个自学项目的通病,别因为它们浪费了时间!
· 在外漂泊的这几年总结和感悟,展望未来
· .NET 数据拷贝方案选择
· .net工作流elsa-书签
2019-10-22 php数组长度怎么获取