Promise之顺序执行

avatar

前言

什么Promise.all(), Promise.any(), Promise.race(), Promise.allSettled()都是并行执行,并按照一定规则来决定Promise的状态
可当Promise之间有严格的执行顺序时,就需要手动将Promise串起来

场景

1. 顺序执行: 后一个P只要求前一个P执行完即可

;(async () => {
  for (let i = 0; i < 4; i++) {
    try {
      const res = await foo(i)
      console.log(res)
    } catch (e) {
      console.log(e)
    }
  }
})()

或者

let pedding = Promise.resolve('')
for (let i = 0; i < 4; i++) {
  // 珠子串起来
  pedding = pedding.then(() => {
    // 每个珠子都完整的处理
    return foo(i).then(res => {
      console.log(res);
    }).catch(e => {
      console.log(e);
    })

  })
}

2. 顺序执行: 全部P成功或失败P中断

let pedding = Promise.resolve('')
for (let i = 0; i < 4; i++) {
  // 珠子串起来
  pedding = pedding.then(res => {
    // 每个珠子只处理resolve, reject自动透传
    console.log(res)
    return foo(i)
  })
}

// 兜底reject
pedding.catch(e => {
  console.log(e)
})

3. 在2的基础上返回最后一个成功的信息

let pedding = Promise.resolve('')
for (let i = 0; i < 4; i++) {
  // 珠子串起来
  pedding = pedding.then(async prev => {
    // 每个珠子返回一个P, 成功时resolve(value), 失败时reject(prev)
    try {
      const res = await foo(i)
      console.log(res)
      return res
    } catch (e) {
      throw prev
    }

  })
}

pedding.then(info => {
  console.log('全部成功', info)
}).catch(info => {
  console.log('最后一个成功', info)
})

总而言之

原则就是将P串成.then().then()....then()链的形式,注意一定要写成pedding = pedding.then()的形式,如果写成pedding.then()就成下图了