首页 > 解决方案 > Javascript承诺执行时间问题

问题描述

我刚刚开始使用 JS 承诺概念,我无法理解为什么在这个例子中两个单独的承诺实际上是“依赖”的(也就是说,为什么如果只声明了“var promise”,执行时间是 2.5 秒,但是当两者都“ var promise" 和 "var promise2" 被声明,两者的执行延迟都是 10s)。

如果两者都声明了,并且只执行了 Promise,我预计它会在 2.5 秒内运行。然而,一旦两者都被声明,console.log 输出会以相同的、更长的延迟出现。这是为什么?如果我添加 Promise.all,我希望console.log 输出承诺出现在 2.5 秒和 Promise.all 出现在 10 秒,但两者同时出现。

function runSlow(delay) {
  const start = Date.now();
  while (Date.now() - start < delay) { } // force a loop to wait 5 seconds is 5000
  return true;
}

$(document).ready(function () {

    var promise = new Promise(function(resolve, reject) {
      // do a thing, possibly async, then…

        var it=runSlow(2500); 
        

      if (it) {
        resolve("Stuff worked!");
      }
      else {
        reject(Error("It broke"));
      }
    });


    var promise2 = new Promise(function(resolve, reject) {
      // do a thing, possibly async, then…

        var it=runSlow(10000);
        
      if (it) {
        resolve("Stuff worked too!");
      }
      else {
        reject(Error("It broke too"));
      }
    });


    promise.then(function(result) {
      console.log(result); // "Stuff worked!"
    }, function(err) {
      console.log(err); // Error: "It broke"
    });



    /*
    Promise.all([promise, promise2]).then(values => { 
      console.log(values);   
    });
    */



});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

标签: javascriptpromise

解决方案


Promise 构造函数同步运行。

所以你在做的是真的

blockThreadFor5s();
scheduleMicroTask();

blockThreadFor5s();
scheduleMicroTask();

Promise 反应将在下一个微任务检查点上执行,这只会在所有同步代码都执行后才会发生,即在两者之后blockThreadFor5s


推荐阅读