承诺的奇怪行为

问题描述 投票:2回答:2

我正在使用promises进行一些测试,并且我编写的代码行为与我期望的方式不同:

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中的循环阻止了代码的执行?

javascript promise es6-promise
2个回答
4
投票

为什么promise中的循环阻止了代码的执行?

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

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

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


1
投票

问题是你的promise不包含任何异步代码。如果你不想等待执行function1的promise中的代码,你需要写它,例如在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();
© www.soinside.com 2019 - 2024. All rights reserved.