promise setTimeout setInterval 执行顺序

promise 马上执行,setTimeout会放到任务队列,最后执行setInterval

2 3 5 4 1 6

setInterval(()=>{

if (!flag){

console.log(6)

flag=true

}

},1000)

 

setTimeout(function () {

console.log(1)

}, 0);

new Promise(function executor(resolve) {

console.log(2);

for (var i = 0; i < 10000; i++) {

       i == 9999 && resolve();

}

console.log(3);

}).then(function () {

console.log(4);

});

console.log(5);

 

多个任务(promise 有 3 种状态:pending(进行中)、fulfilled(已完成,又称为Resolved) 或 rejected(已失败))

使用promise.all() Promise.all方法用于将多个Promise实例,包装成一个新的Promise实例。

Promise.all方法接受一个数组作为参数,数组里的元素都是Promise对象的实例,如果不是,就会先调用下面讲到的Promise.resolve方法,将参数转为Promise实例,再进一步处理。(Promise.all方法的参数可以不是数组,但必须具有Iterator接口,且返回的每个成员都是Promise实例。) Promise.all方法接受一个数组作为参数,数组里的元素都是Promise对象的实例,如果不是,就会先调用下面讲到的Promise.resolve方法,将参数转为Promise实例,再进一步处理。(Promise.all方法的参数可以不是数组,但必须具有Iterator接口,且返回的每个成员都是Promise实例。)

 

示例: var p =Promise.all([p1,p2,p3]); p的状态由p1、p2、p3决定,分为两种情况。 当该数组里的所有Promise实例都进入Fulfilled状态:Promise.all**返回的实例才会变成Fulfilled状态。并将Promise实例数组的所有返回值组成一个数组,传递给Promise.all返回实例的回调函数**。 当该数组里的某个Promise实例都进入Rejected状态:Promise.all返回的实例会立即变成Rejected状态。并将第一个rejected的实例返回值传递给Promise.all返回实例的回调函数。

 

const promise = new Promise((resolve, reject) => {

    console.log(1)

    resolve()

    console.log(2)

})

promise.then(() => {

     console.log(3)

})

console.log(4)

// 1

// 2

// 4

// 3

// Promise 构造函数是同步执行的,promise.then 中的函数是异步执行的。

const promise = new Promise((resolve, reject) => {

    resolve('success1')

    reject('error')

    resolve('success2')

})

 

promise.then((res) => {

console.log('then: ', res)

}).catch((err) => {

console.log('catch: ', err)

})

 

// then: success1

// 原因:

// 构造函数中的 resolve 或 reject 只有第一次执行有效,多次调用没有任何作用,呼应代码二结论:promise 状态一旦改变则不能再变。

 

Promise.resolve(1)

.then((res) => {

        console.log(res)

 return 2

}).catch((err) => {

return 3

}).then((res) => {

    console.log(res)

})

// 运行结果: 1 2

// 原因:

// promise 可以链式调用。提起链式调用我们通常会想到通过 return this 实现,不过 Promise 并不是这样实现的。promise 每次调用 .then 或者 .catch 都会返回一个新的 promise,从而实现了链式调用。

 

setTimeout、Promise、Async/Await 的区别

   事件循环中分为宏任务队列和微任务队列

  其中setTimeout的回调函数放到宏任务队列里,等到执行栈清空以后执行

  promise.then里的回调函数会放到相应宏任务的微任务队列里,等宏任务里面的同步代码执行完再执行

  async函数表示函数里面可能会有异步方法,await后面跟一个表达式

  async方法执行时,遇到await会立即执行表达式,然后把表达式后面的代码放到微任务队列里,让出执行栈让同步代码先执行

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值