为了账号安全,请及时绑定邮箱和手机立即绑定

承诺很古怪

承诺很古怪

不负相思意 2021-05-07 14:15:21
我正在做一些带有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 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

为什么Promise中的循环会阻止代码的执行?

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

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

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


查看完整回答
反对 回复 2021-05-13
?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

问题是您的诺言不包含任何异步代码。如果不想等待在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();


查看完整回答
反对 回复 2021-05-13
  • 2 回答
  • 0 关注
  • 142 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信