promise .all() .race() .allSettled()

promise 状态

pending: 初始状态
fulfilled: 操作成功完成
rejected: 操作失败
settled: 完成(成功或失败)

image.png

组合函数

基元函数: Promise.resolve() , Promise.reject(), Promise.finally()
组合函数:Promise.all(), Promise.race(), Promise.allSettled()

Promise.all()

Promise.all(promises:Iterable): Promise

  • 其工作原理如下,全部运行成功,则返回成功数据组成的数组,任意一个promise失败,就会停止请求,并返回该错误:


    image.png
  • 使用场景:
    并行处理耗时的处理,缩短处理时间:

const urls = [
  'http://xxxx.com/user',
  'http://xxxx.com/config',
]

result = await Promise.all(urls.map( url => get(url))) // 成功运行后result 为每个promise运行返回数据组成的数组

Promise.race()

Promise.race(promises:Iterable): Promise

  • 其工作原理如下:


    image.png
  • 使用场景
    解决网络超时,将网络请求和定时器进行比较,请求时间大于定时器的时间,将会报错:

interface TimeoutResponse {
  timeout: Nodejs.Timeout,
  pending: Promise
}
function createTimeout(duration: number): TimeoutResponse[] {
  let timeout
  const pending: Promise = new Promise((__, reject) => {
    timeout = setTimeout((): void => {
      reject(new TimeoutError())
    }, duration)
  })
  return [timeout, pending]
}
class TimeoutError extends Error {
  constructor(message = 'Operation timeout'){
    super(message)
    this.message = message
    this.name = 'TimeoutError'
  }
}
try{
  [timeout, pending] = createTimeout(5000),
  await Promise.race([httpRequest, pending])
} catch (err) {
  if(err instanceof TimeoutError) {
    ///xxxxx
  }
} finally {
  clearTimeout(timeout)
}

Promise.allSettled()

Promise.allSettled(promises:Iterable): Promise>

  • 其工作原理如下,Promise.allSettled跟Promise.all类似, 其参数接受一个Promise的数组, 返回一个新的Promise, 唯一的不同在于, 其不会进行短路, 也就是说当Promise全部处理完成后我们可以拿到每个Promise的状态, 而不管其是否处理成功.


    image.png
  • 应用场景
    并行处理:

// sample 1
Promise.allSettled([
  Promise.resolve('a'),
  Promise.reject('b'),
])
.then(arr => assert.deepEqual(arr, [
  { status: 'fulfilled', value:  'a' },
  { status: 'rejected',  reason: 'b' },
]));

// sample 2
const urls = [
  'http://xxxx.com/user',
  'http://xxxx.com/config',
]

result = await Promise.allSettled(urls.map( url => get(url))) // 、运行后result 为每个promise运行返回数据组成的数组,无论成功失败

你可能感兴趣的:(promise .all() .race() .allSettled())