Promise、async、setTimeout异步执行顺序问题

大脑暴来了~~易头晕者勿入

题目一:

console.log('script start');
    
setTimeout(function() {
  console.log('setTimeout');
}, 0);

const newPromise6 = new Promise(function(resolve, reject) {
  resolve(console.log('promise1'));
});

newPromise6.then(function() {
  console.log('promise2');
}).then(function() {
  console.log('promise3');
});

console.log('script end');在chrome中输出结果?

结果:
script start
promise1
script end
promise2
promise3
setTimeout

解析:
异步任务之间,会存在差异,所以它们执行的优先级也会有区别。
大致分为 微任务(microtask,如:Promise、MutaionObserver等)和 
宏任务(macrotask,如:setTimeout、setInterval、I/O等)。

1、setTimeout  定时器,属于js任务队列里的宏任务。
指的是把任务队列塞进执行栈里等待执行线程依次执行。虽然可以把它设置微0,但是仍然需要等待本轮执行环境里面的**所有同步和异步任**执行完毕之后才会去执行它。

2、promise es6的异步语法,属于js任务队列里的微任务。
在执行本轮宏任务的过程中,如果遇到promise,会将其塞入本轮执行过程的微任务,待本轮**宏任务执行完毕之后,才会执行它**。执行完毕之后,开始执行下一轮任务队列。

题目二:

async function async1() {
  console.log("async1 start");
  await  async2();
  console.log("async1 end");
}

async  function async2() {
  console.log( 'async2');
}

console.log("script start");

setTimeout(function () {
  console.log("settimeout");
},0);

async1();

new Promise(function (resolve) {
  resolve(console.log("promise1"));
}).then(function () {
  console.log("promise2");
});

console.log('script end');

答案:
script start
async1 start
async2
promise1
script end
async1 end
promise2
settimeout

题目三:将promise调入前面,比较一下then和await

new Promise(function (resolve) {
  resolve(console.log("promise1"));
}).then(function () {
  console.log("promise2");
});

async function async1() {
  console.log("async1 start");
  await  async2();
  console.log("async1 end");
}

async  function async2() {
  console.log( 'async2');
}

console.log("script start");

setTimeout(function () {
  console.log("settimeout");
},0);

async1();

console.log('script end');

答案:
script start
async1 start
async2
promise1
script end
promise2
async1 end
settimeout

解析:
3、async await 异步语法,基于promise,是其语法糖,让异步更像同步任务。
如果使用async,函数体里有return XX,会被包装成一个异步promise.resolve(‘XXX’), 如果没有显式return,那么async也同样包装成promise.resolve(‘undefined’);

注意:await 标志着js会去**先执行一遍后面紧跟的函数,然后马上让出线程,跳出整个async**,去执行本轮执行周期里面的任务,等待本轮的宏任务(同步任务)执行完成之后,再回来async里等待之前await的函数的返回值,如果是返回值异步promise,那么会把它塞入promise.resolve()微任务(异步任务执行栈),等待它前面的异步任务执行完毕之后,再得到await promise.resolve()的值,然后才是去执行await后面的逻辑,如果await 函数体返回的不是异步promise,那么就直接去执行其后面的逻辑。

?终极大boss

async function async1() {
 console.log("async1 start");
 await  async2(); 
 const newPromise6 = new Promise(function(resolve, reject) {
   resolve(console.log('promise11111'));
 }).then(() => {console.log('then2222222')});
 console.log("async1 end");
}

async  function async2() {
 console.log( 'async2');
}

console.log("script start");

setTimeout(function () {
 console.log("settimeout");
},0);

async1();

new Promise(function (resolve) {
 resolve(console.log("promise1"));
}).then(function () {
 console.log("promise2");
});

console.log('script end');

答案:
script start
async1 start
async2
promise1
script end
promise11111
async1 end
promise2
then2222222
settimeout

自己动手敲一敲,理解一下下吧~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: promisesetTimeout都是JavaScript中常用的异步编程方式,但是它们的应用场景和特点略有不同。 promise是一种用于处理异步操作的对象,它可以将异步操作的结果传递给相关代码,以便于异步操作完成后进行后续处理。Promise有三种状态:Pending(进行中)、Resolved(已完成)和Rejected(已失败),当异步操作完成后,可以将Promise状态从Pending改为Resolved或者Rejected,并将相应的结果传递给相关代码。 setTimeout是一种用于在一定时间后执行某个函数的方法。它会在指定的时间间隔之后将指定的代码添加到任务队列中,并在执行栈为空时执行该代码。setTimeout是一种延时执行的方法,通常用于在等待一段时间之后执行某些操作,比如延迟加载资源或者实现一些动画效果。 从应用场景来看,Promise通常用于需要处理异步操作结果的场景,而setTimeout通常用于需要在一定时间之后执行某些代码的场景。从技术特点来看,Promise可以很好地处理异步操作的结果,而setTimeout主要是用于延时执行某些代码。因此,在不同的场景下,选择使用Promise或者setTimeout都需要考虑具体的需求和实现方式。 ### 回答2: 在JavaScript中,PromisesetTimeout是两个不同的概念,它们的执行顺序取决于具体的代码逻辑和使用方式。 Promise是一种异步编程的解决方案,用于处理一些需要花费时间的操作。当我们创建一个Promise对象时,其中的代码会被立即执行,并且可以设置回调函数处理异步操作的结果。一旦Promise对象的状态发生改变(可以是fulfilled满足或rejected拒绝),相应的回调函数将会被调用。 而setTimeout是JavaScript的一个定时器函数,用于在指定的延迟时间之后执行一段代码。当我们使用setTimeout函数时,其中的代码会被放入到一个任务队列中,在指定的延迟时间之后,才会被执行。 根据执行机制,Promise通常拥有更高的优先级。Promise对象中的代码会立即执行,而setTimeout中的代码则会在其他同步任务执行完毕后才会被执行。也就是说,Promise中的代码会被优先执行,而setTimeout中的代码会在Promise对象执行完毕后才会被执行。 然而,如果我们使用了async/await等异步操作,PromisesetTimeout执行顺序就有可能受到影响。在这种情况下,可能会出现在Promise中的代码还未执行完毕,但由于设置了一个较短的延迟时间,setTimeout中的代码先被执行的情况。 总结起来,Promise通常拥有更高的优先级,其代码会立即执行。setTimeout中的代码会在Promise代码执行完毕后才会被执行,除非使用了某些特殊的异步操作方式。 ### 回答3: PromisesetTimeout没有优先性的比较,因为它们是完全不同的东西。 Promise是一种处理异步操作的机制,它可以用于处理异步操作的状态和结果。当我们创建一个Promise对象时,它可以包含异步操作的结果,并提供一些方法来处理成功或失败时的逻辑。Promise执行顺序由代码中的逻辑和异步操作的执行时间决定,与setTimeout没有直接的关系。 setTimeout是一个用于设置在一定延迟时间后执行的函数的方法。它允许我们在指定的延迟时间之后执行一段代码。setTimeout的执行时间是相对于调用它的时刻来计算的,它不受Promise的状态或结果影响。 根据上述解释,PromisesetTimeout执行顺序上没有优先性的比较。它们是独立的概念,用于不同的目的。Promise用于处理异步操作的状态和结果,而setTimeout用于延迟执行一段代码。在实际开发中,我们可以根据需求选择使用PromisesetTimeout,或者它们的组合来处理不同的情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值