猿问

承诺很古怪

我正在做一些带有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中的循环会阻止代码的执行?


不负相思意
浏览 143回答 2
2回答

蝴蝶刀刀

为什么Promise中的循环会阻止代码的执行?这就是JavaScript执行模型(在Browsers和Node中)。您的代码永远不会被抢占,代码始终从头到尾运行,并且只能为平台“注册”代码以便以后运行。promise构造函数同步运行。承诺不会在您的代码中引入线程,它们只会将正在then回调中的运行代码推迟到“所有同步代码之后”,但推迟到所有平台代码之前。承诺只是将来值的句柄-它们不会使您的代码在另一个线程上执行。如果您需要在另一个线程上运行代码,则需要worker_threads在浏览器中使用(在Node.js中)或Web Worker。

牧羊人nacy

问题是您的诺言不包含任何异步代码。如果不想等待在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();
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答