Promise

51 阅读3分钟
premise常见笔试题

参考: www.explainthis.io/zh-hans/swe… blog.csdn.net/2401_873133…

宏任务: setTimeout、setInterval 微任务: promise.then

其他特殊: 一次只会读取一个宏任务,然后就回去看微任务 await: 先将await的结果打印出来,await后面的任务类似于promise放入微任务 new Promise()后面的内容会立即打印 promise中,没有resolve,.then后面的内容不会打印,只有调用resovle,才会走到.then中的内容。 多个.then或者await,当前的.then或者await执行完毕之后,把后续的.then或者await后面的代码继续放到微任务

,Promise构造函数是直接调用的同步代码,resolve如果调用的方法也会立即执行,如果调用的是同步方法就会同步执行,如果是异步方法就会按照异步方法执行

      console.log("1");
      async function one() {
        await two()
        console.log("2");
        await three()
        console.log("3");
      }
      async function two() {
        console.log("4");
      }
      async function three() {
        console.log("5");
      }
      one()
      setTimeout(() => {
        console.log("6");
      }, 0);
      new Promise((resolve) => {
        console.log("7");
        resolve()
      }).then(() =>{
        console.log("8");
      }).then(() =>{
        console.log("9");
      })
      //1 4 7 2 5 8 3 9 6
      
1.主线程执行同步代码输出“1”,再调用one函数

2.执行one函数,立即执行two函数输出“43.two()后面的任务放入微任务队列中

4.跳出one函数中,将定时器任务放入宏任务队列中。

5.执行Promise同步函数输出“7” 在将then中的回调函数放入微队伍队列中

6.主线程任务执行完毕,执行微任务队列,先输出“2”,再执行three()函数

7.输出“5”,在将log(3)放入微队伍队列。

8.输出创建的Promise对象的then回调的函数输出“8”,再将第二个then放入微任务队列

9.执行one函数的最后一个任务,输出“310.在清空微任务队列最后一个“911.微任务队列情况,执行宏任务输出“6
 new Promise ((resolve, reject) => {
        console.log (1)
        new Promise((resolve, reject) => {
        console.log(2)
        setTimeout(() => {
        resolve(3)
        console.log(4)
        })
        }).then(data => {
            setTimeout(() => {
            console.log(5)
        })
        console.log(data)
        })
        setTimeout(() => {
            resolve(6)
            console.log(7)
        })
        }).then(data => {
            console.log(data)
            setTimeout(() => {
                console.log(8)
            })
        console.log(9)
        })
        
1.主线程执行输出“1”在进入另一个Promise对象中输出“2”,注意:由于resolve在setTimeout宏任务队列中,resolve暂时没有传值,故这里的then不能走,也就不能放入微任务队列中。

2.将第一个setTimeout放入宏任务队列中。再将第二个setTimeout放入宏任务队列中。

3.主线程任务做完,微任务队列是空的,那我们执行宏任务。先执行第一个宏任务。

4.由于resolve(3),将与其对应的then的回调函数放入微任务队列中。再输出“45.第一个宏任务做完,开始做微任务,故来到then的回调函数中,输出“3”,并将输出“5”的定时器放入宏队列中。

6.微任务做完,开始做第二个宏任务,由于resolve(6),将与其对应的then的回调函数放入微任务队列中。在输出“7”。

7.与步骤五一样,开始做微任务队列,输出传进去的data,输出“6”再将输出“8”的计时器放入宏任务队列中,在输出“98.最后,微任务做完,开始搞宏任务了!。俩个定时器内容,输出“5”输出“8”完成。
new Promise(() => {
  console.log('');
  throw new Error('error1');
})
  .catch(() => {
    console.log('2');
  })
  .then(() => {
    console.log('3');
  });
  
  
创建 Promise 对象:
new Promise 的回调函数是同步执行的,所以会立即执行函数体内部代码。
console.log(''); 输出一个空行。
接着抛出了一个错误 throw new Error('error1');。
由于这个错误并没有在 new Promise 内部处理,因此它会导致该 Promise 直接进入 rejected 状态。
catch 捕获错误:
.catch() 是用来捕获 Promise 的 rejected 状态的。
当前 Promise 是 rejected 状态,所以 .catch() 会被触发。你会看到 console.log('2'); 输出 2。
then 链式调用:
.then() 在 .catch() 之后链式调用。
需要注意的是,如果 .catch() 没有抛出其他错误或者返回一个 rejected 状态的 Promise,它会返回一个 resolved 状态的 Promise。
因此,.then() 中的回调函数会被执行,并输出 console.log('3');。