Promise易错点

  1. promise只有三种状态pending,resolved,rejected,且某时刻下一定处于3者之一。
  2. 每一个promise实例的状态改变只有两种情况pending->resolved,pending->rejected一旦发生其中之一,状态就会凝固不会在发生变化。即便以后再次改变。
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 就不会再发生状态改变。
  1. promise 可以链式调用。提起链式调用我们通常会想到通过 return this 实现,不过 Promise 并不是这样实现的。promise 每次调用 .then 或者 .catch 都会返回一个新的 promise,(即使你返回了某个类型的值,也会被包裹为resolved的参数)从而实现了链式调用。

    Promise.resolve(1)
    .then((res) => {
     console.log(res)
     return 2
    })
    .catch((err) => {
     return 3
    })
    .then((res) => {
     console.log(res)
    })
    // 1
    // 2
  2. setTimeout也相当于“异步执行了1次”, .then()是异步调用的,当状态改变为resolved,或者rejected,之后多次调用then返回的值不会改变

    const promise = new Promise((resolve, reject) => {
    setTimeout(() => {
     console.log('once')
     resolve('success')
    }, 1000)
    })
    console.log("break;")
    const start = Date.now()
    promise.then((res) => {
    console.log(res, Date.now() - start)
    })
    promise.then((res) => {
    console.log(res, Date.now() - start)
    })
    // break; 
    //once
    // success 1001
    // success 1002
  3. process.nextTick 和 promise.then 都属于 microtasks,而 setImmediate 属于 macrotasks,在事件循环的 check 阶段执行。事件循环的每个阶段(macrotasks)之间都会执行 microtasks,事件循环的开始会先执行一次 microtasks。

    process.nextTick(() => {
    console.log('nextTick')
    })
    Promise.resolve()
    .then(() => {
    console.log('then')
    })
    setImmediate(() => {
    console.log('setImmediate')
    })
    console.log('end')
    // end
    // nextTick
    // then 
    //setImmediate

猜你喜欢

转载自blog.csdn.net/llr_H5/article/details/80631006