Promise方法学习

224 阅读3分钟

「这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战

Promise.resolve方法

Promise 对象的状态从 PENDING 变为 FULFILLED,并执行成功后的注册任务

Promise.reject方法

Promise 对象的状态从 PENDING 变为 REJECTED,并执行失败后的注册任务

Promise.then方法

then()  方法返回一个 新的Promise实例 。它最多需要有两个参数:Promise 的成功和失败情况的回调函数,onResolved(fulfilled状态的回调)、onRejected(rejected状态的回调) image.png

在面试过程中经常会被问到promise执行顺序的问题:

// executor是同步执行的
let promise = new Promise((resolve, reject) => {
  resolve('承诺实现')
  // reject('承诺失败')
  // throw new Error('error:承诺失败')
})

// then是异步调用
promise.then((res) => {
  console.log('then resolve')
}, (err) => {
  console.log('then reject', err)
})

console.log('window')

image.png

then是异步调用, reject具有穿透作用: 由于then会返回一个Promise的实例,是可以被链式调用的。

// executor是同步执行的
let promise = new Promise((resolve, reject) => {
  // resolve('承诺实现')
  // reject('承诺失败')
  // 直接抛出一个错误的话,reject和catch也是可以拿到的
  throw new Error('error:承诺失败')
})
/**
 * @description then返回一个新的Promise实例,then是异步调用
 */
promise.then((res) => {
  // 参数res是resolve出来的结果
  console.log('then resolve', res);
  // 这里还是需要返回一个Promise,后面的then才能继续使用
  // return new Promise((resolve, reject) => resolve(res+'111'))
}
//   , (res) => {
//   // 只返resolve时,这里是不会走的,只会走reject,需要在Promise中reject出数据
//   console.log(1, res)
// }
).then((res) => {
    // then reject具有穿透作用,如果上一级then的reject对应函数没传的话,这里是可以接收到的
    console.log('res', res);
}
  , (err) => {
  // then里面执行的话,catch中就不会执行
  console.log('then reject', err);
  }
).catch((err) => {
  // 如果前面所有then里面的reject都没有处理的话,错误信息是会走到catch的
  console.log('catch', err);
})

image.png

Promise.catch 方法

catch方法返回一个新的Promise实例,处理所有异常情况

Promise.all 方法

Promise.all 等待所有都完成(或第一个失败) Promise.all()方法接收多个Promise实例,该方法接受一个由Promise对象组成的数组作为参数(参数可以不是数组,但必须具有Iterator接口,且每个成员返回的都是Promise实例)。如果传入的 promise 中有一个失败(rejected),Promise.all 异步地将失败的那个结果给失败状态的回调函数,而不管其它 promise 是否完成。 Promise.all用于多个异步任务并发运行,他的结果创建承诺之后使用,等待所有任务结果的完成。iterable内部元素传递的是promise对象集合,如果不是promise,直接resolve,Promise.resolve(0 || '123' || true), iterable内部没有元素,返回空数组。 有一个promise是rejected 实例会调 rejected, 失败的原因是第一个失败的promise结果

Promise.race 方法

Promise.race(iterable) 方法返回一个 promise,参数与Promise.all()一样,一旦迭代器中的某个promise解决或拒绝,返回的 promise就会解决或拒绝,即将改变状态的promise实例返回值作为Promise.race()方法产生的Promise实例的返回值。

谁先完成就返回哪个promise的结果,而且无论是fullfilled 还是 rejected。 如果可迭代容器为空,返回Promise永远都是pending状态。 多用于测试资源或者接口的响应速度; 速度对比,测试响应速度.