与promise并行运行两个javascript函数

时间:2018-09-13 21:30:13

标签: javascript promise

(function() {

  function main() {
    call1();
    call2();
  }

  function call1() {
    return new Promise(() => {
      for (let i=0; i<100; i++) {
        console.log('This is call-1:', i);
      }
    });
  }

  function call2() {
    return new Promise(() => {
      for (let i=0; i<100; i++) {
        console.log('This is call-2:', i);
      }
    });
  }

  main();

})();

http://plnkr.co/edit/NtioG92Tiba1KuKTx24I

输出包含所有call-1语句,后跟所有call-2语句。我想并行运行这两个电话。这只是一个模拟我的真实代码的示例,其中我有2个函数,每个函数内部都有ajax调用。这些呼叫的成功或失败会触发另一系列的呼叫。因此,我想将这两个主要功能并行进行。这是正确的方法吗?

2 个答案:

答案 0 :(得分:1)

这是一个关于承诺的相当普遍的误解。 Promise构造函数(或更确切地说,您传递给它的函数)是同步立即执行的。

以下代码:

console.log(1);
new Promise(resolve => resolve(console.log(2));
console.log(3);

始终按此顺序输出1 2 3。

您传递给两个Promise构造函数的两个函数都是完全同步的。没有异步操作(例如setTimeout或使用回调读取文件),因此它一个接一个地执行。

不同于其他一些答案可能会告诉您,在这种情况下,Promise.all()不会拯救您。事件循环,滴答声或您可能听说过的任何其他其他术语都不会生效。您的代码是完全同步的。


大多数JavaScript运行时(浏览器,Node.js等)都是单线程,因为您的JavaScript代码在单个线程中运行(浏览器使用多个线程,而您的JS代码在一个线程中运行)。

因此,在这种特定情况下,您无能为力(除了使用worker或其他线程选项,您可能不想进入这些选项)。即使有诡计,也无法神奇地使同步代码异步。

答案 1 :(得分:-1)

查看Promise.all https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

这将调用您的所有诺​​言,并在它们完成(已解决或被拒绝)时解决。

根据您的用例,另一个选项是Promise.race

这将返回完成(解决或拒绝)https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/race

的第一个Promise。