promise settimeout promise.all async/await的打印顺序

promise settimeout promise.all async/await的打印顺序

在理解 Promise、setTimeout、Promise.all 和 async/await 的打印顺序之前,我们需要了解它们的行为和执行机制。

  1. Promise:Promise 是 JavaScript 中处理异步操作的对象。它表示一个异步操作的最终完成(或失败)及其结果值。Promise 有三种状态:pending(进行中)、fulfilled(已完成)和 rejected(已拒绝)。可以通过调用 then() 方法或使用 async/await 语法来处理 Promise 的结果。
  2. setTimeout:setTimeout 是一个计时器函数,用于在指定的时间间隔之后执行一次指定的函数或一段代码。
  3. Promise.all:Promise.all 接收一个 Promise 对象数组,并返回一个新的 Promise 对象。它会等待数组中的所有 Promise 对象都变为 fulfilled 状态后,才会将结果作为一个数组传递给新的 Promise。
  4. async/await:async/await 是 ES2017 引入的一种处理异步操作的语法糖。使用 async 关键字定义的函数会返回一个 Promise 对象,而在 async 函数内部使用 await 关键字可以暂停函数的执行,等待 Promise 对象的状态变为 fulfilled,然后将结果返回。

现在来看一下它们的打印顺序:

// 示例代码
console.log('Start');

setTimeout(() => {
    
    
  console.log('setTimeout');
}, 0);

Promise.resolve().then(() => {
    
    
  console.log('Promise 1');
});

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

(async () => {
    
    
  await Promise.resolve();
  console.log('Async');
})();

Promise.all([
  Promise.resolve(),
  Promise.resolve()
]).then(() => {
    
    
  console.log('Promise.all');
});

console.log('End');

按照以上代码的执行顺序,输出结果通常是:

Start
End
Promise 1
Promise 2
Async
Promise.all
setTimeout

解释一下这个顺序:

  1. 首先输出 “Start”,然后立即输出 “End”,因为它们是同步代码。
  2. 接下来是两个 Promise 的回调函数,它们被添加到微任务队列中,按照添加顺序依次执行。所以先输出 “Promise 1”,然后输出 “Promise 2”。
  3. 然后是 async/await 中的代码,它也是一个微任务,会等待前面的 Promise 回调函数执行完毕后才执行。所以输出 “Async”。
  4. 接下来是 Promise.all 的回调函数,它会等待 Promise.all 的所有 Promise 对象都变为 fulfilled 状态,然后执行。所以输出 “Promise.all”。
  5. 最后是 setTimeout,它是一个宏任务,会在下一个事件循环中执行。所以输出 “setTimeout”。

需要注意的是,由于事件循环的机制,实际的执行顺序可能会有微小的差异,但以上的顺序是最常见的情况。

猜你喜欢

转载自blog.csdn.net/weixin_44867717/article/details/132670677