image.png

状态分析

Promise 本质上 是 对 状态 的一种 管理

state result
new Promise pending 进行中
resolve(res) 成功 fulfilled 已成功 res
reject(error) 失败 rejected 已失败 error

Promise 一共只有 三种状态, pending/fulfilled/rejected, 这是不会受 外界影响的。只有 异步操作的 结果才能决定 Promise 处于哪个 状态

Promise 的 本意是 承诺、许诺,表示 状态一旦确定,就很难改变,
Promise 的 状态 不论是 从 pending -> fulfilled 还是 pending -> rejected
一旦 state 状态确定下来,就无法改变, 是不可逆的

  1. const p1 = new Promise((resolve, reject) => {
  2. resolve(1)
  3. });
  4. const p2 = new Promise((resolve, reject) => {
  5. setTimeout(() => {
  6. resolve(2)
  7. }, 1000);
  8. });
  9. const p3 = new Promise((resolve, reject) => {
  10. setTimeout(() => {
  11. reject(3)
  12. }, 1000);
  13. });
  14. console.log(p1)
  15. console.log(p2)
  16. console.log(p3)

image.png
这里 promise的状态是 pending 的原因是 —> setTimeout 的时间还没结束,
所以 promise 函数还没调用 resolve()reject() 方法,所以 promisepending 状态没有发生变化

如果我们在调用 p2 和 p3 的时候等待两秒,就可以看到 promise 状态的改变了

const p2 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve(2)
  }, 1000);
});

const p3 = new Promise((resolve, reject) => {
  setTimeout(() => {
    reject(3)
  }, 1000);
});

setTimeout(() => {
  console.log(p2)
},2000);

setTimeout(() => {
  console.log(p3)
},3000);

image.png
这里讲promise对象的放入新的定时器中,等待promise 的pending状态结束,就可以看到最终的数据结果

then 与 catch

then(res) 方法中接收的参数是,resolve(res)处理的数据,
catch(err) 方法中接收的参数是 reject(err)处理的数据

const p1 = new Promise((resolve, reject) => {
  resolve(1)
});

const p2 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve(2)
  }, 1000);
});

const p3 = new Promise((resolve, reject) => {
  setTimeout(() => {
    reject(3)
  }, 1000);
});

p1.then(res => {
  console.log('p1 then', res)
})
p2.then(res => {
  console.log('p2 then', res)
})
p3.catch(err => {
  console.log('p3 catch', err)
})

image.png

状态不可逆原因

我们先输出成功然后输出失败,看看状态是否会发生改变

let p = new Promise((resolve, reject) => {
  resolve('resolve')
  reject('reject')
})

p.then(res => {
  console.log(res)
}, err => {
  console.log(err)
})

// resolve

let p = new Promise((resolve, reject) => {
  reject('reject')
  resolve('resolve')
})

p.then(res => {
  console.log(res)
}, err => {
  console.log(err)
})
// reject

根据结果可以看出, promise 状态一旦确认下来,就不会发生改变