承诺很古怪

时间:2019-04-26 12:50:56

标签: javascript promise es6-promise

我正在做一些带有Promise的测试,并且编写的代码表现得不符合我的期望:

function function1() {
  return new Promise((resolve, reject) => {
    let i = 5000000000;
    while (i > 0) {
      i--;
    }
    resolve("print function1!!!");
  });
}

function function2() {
  console.log("print function2!!!");
}

function function3() {
  function1().then(data => console.log(data));
  function2();
}

function3();

此代码的执行等待function1中循环的完成,然后打印:

  

打印功能2 !!!

     

打印功能1 !!!

我期望代码会打印“ print function2 !!!”。然后等待循环完成,然后打印“ print function1 !!!”。

promise中的循环为什么会阻塞代码的执行?

2 个答案:

答案 0 :(得分:4)

  

promise中的循环为什么会阻塞代码的执行?

这是JavaScript执行模型(在浏览器和Node中)。您的代码永远不会被抢占,代码总是从头到尾运行,并且只能为平台“注册”代码以便以后运行。

promise构造函数同步运行。承诺不会在您的代码中引入线程,它们只会将then回调中的运行代码推迟到“在所有同步代码之后”,但在所有平台代码之前。

承诺只是将来值的句柄-它们不会使您的代码在另一个线程上执行。如果需要在另一个线程上运行代码,则需要在浏览器中使用worker_threads(在Node.js中)或Web worker。

答案 1 :(得分:1)

问题是您的诺言不包含任何异步代码。 如果您不想等待功能1的承诺中的代码被执行,则需要编写例如在setTimeout中。

function function1() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      let i = 5000000000;
      while (i > 0) {
        i--;
      }
      resolve("print function1!!!");
    }, 0);
  });
}

function function2() {
  console.log("print function2!!!");
}

function function3() {
  function1().then(data => console.log(data));
  function2();
}

function3();