zoukankan      html  css  js  c++  java
  • promise经典题目

    当一个promise进入settled状态时,它后面的then回调会被置入微任务队列。

    settle的时机,决定了回调函数进入微队列的时间,决定了执行顺序。

    代码一:

    new Promise((resolve) => {
      resolve();
      Promise.resolve({
        then: function(resolve, reject) {
          console.log(1);
          resolve();
        },
      }).then(() => console.log(2));
      console.log(0);
    }).then(() => console.log(3));

    解析:从第三行开始

    当Promise.resolve()接收一个thenable参数时,即刻产生了一个promise1,并返回这个promise1,这个promise1被 settle的时机是thenable.then的resolve被调用时。

    当Promise.resolve({ then: ... })执行完成,将thenable.then放入微任务队列,并返回一个promise1,然后执行了console.log(0)

    console.log(0)执行完成后,(resolve) => { .... },这个代码块执行结束,调用栈清空,同时返回了一个promise0。

    promise0立刻转为settle状态,致使() => console.log(3) 进入微任务队列

    thenable.then在微任务队列弹出,执行console.log(1); resolve();

    promise1 settle,导致() => console.log(2)进入微任务队列;

    此时,微任务队列内还剩() => console.log(3)和() => console.log(2),根据入队顺序,依次被调用。

     

    代码二:

    new Promise((resolve) => {
      resolve();
      Promise.resolve().then(() => console.log(2));
    }).then(() => console.log(4));

    解析:依次执行

    new Promise(...

    resolve();

    Promise.resolve().then(() => console.log(2)),此时Promise.resolve产生了一个promise1,并立即settle,导致console.log(2)进入微任务队列

    new Promise(... 构造函数返回,生成了一个promise2。promise2即刻settle,导致() => console.log(4)进入微任务队列。

    调用栈清空,开始依次执行微任务。

  • 相关阅读:
    AlphaMobileControls
    .NET Compact Framework下注册表导出工具的开发
    windows moblie 5.0在托管程序中实现短信接收和拦截
    自定义MessageBox
    Windows Mobile 背景灯控制
    windows Mobile 启动Mobile Office
    windows mobile 5.0 进程管理、窗体管理、重启和关闭操作系统
    让Windows Mobile模拟器通过你的PC上网
    Windows Mobile获取存储卡容量及使用情况
    透明背景
  • 原文地址:https://www.cnblogs.com/LeoXnote/p/14301791.html
Copyright © 2011-2022 走看看