【问题标题】:How to execute functions parallel in typescript-es5如何在 typescript-es5 中并行执行函数
【发布时间】:2017-01-21 04:44:05
【问题描述】:

我在 angular2/typescript 应用程序中有一个函数列表,称为:f1f2f3f4 等...这些函数可以按任何顺序执行,它们都返回 void .

我正在考虑并行运行它们,但不知道如何使用目标 ES5 来实现。

执行这些功能的最佳方式是什么?

谢谢,

奥斯汀

【问题讨论】:

  • 如果它们是异步的...f1(); f2(); f3(); f4(); 将启动它们而不等待前一个完成
  • 如果我们的目标 typescript 支持 ES5,如何创建异步函数?
  • How to create async function 如果 f1...f4 已经做了一些异步操作,那就无关紧要了

标签: javascript promise


【解决方案1】:

在浏览器中只有一个 UI 线程。如果您在 UI 线程中运行代码,则永远不会并行运行任何东西。

如果您想并行运行代码,您可以使用网络工作者。 单个 Web Worker 也只是一个线程,如果要并行运行多个函数,则需要为每个函数创建一个新的 Web Worker 实例。

我不知道网络工作者支持的当前状态。

更多细节参见例子

【讨论】:

  • 如果这是真的,你将如何解释 httpclient.get 如果在我订阅它之后,我在 .subscribe() 调用下的所有代码都将在 httpclient.get 完成之前执行?跨度>
  • 并发和并行是有区别的。当代码执行委托给回调(Promise)时,其他代码会一直执行,直到它完成或等待回调。这就是您的代码在获取请求等待来自服务器的响应时所做的事情。见developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop。还有其他关于这个主题的好文章。
  • 感谢您的意见。使用 Observable 可以委托吗?谢谢。
  • @ArtanisZeratul 抱歉,不知道这是什么意思
【解决方案2】:

由于您的所有功能很可能都是承诺,并且您不关心输出或顺序,因此我建议使用Promise.all()

Promise.all([f1(), f2(), f3(), f4(), f5()])
  .then(_ => console.log('all completed'));

这将让 Promise 在后台运行,并且仅在所有完成后向您报告。

【讨论】:

    猜你喜欢
    • 2017-12-26
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-11
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    相关资源
    最近更新 更多