Skip to content

Promise

异步操作

Promise 使用

  1. Promise.then, Promise.catch,Promise.resolve 默认返回一个 resolved 的 Promise

  2. Promise.all()只要有一个返回一个拒绝状态就是拒绝状态

  3. Promise.race() 只要有一个返回成功状态就是成功状态,哪个返回快就选择哪个作为返回值

    示例:设置接口超时时间

    js
    function query(url, delay = 4000) {
      const promises = [
        ajax(url),
        new Promise((resolve, reject) => {
          setTimeout(() => {
            // eslint-disable-next-line prefer-promise-reject-errors
            reject('请求超时')
          }, delay)
        }),
      ]
      return Promise.race(promises).then(value => console.log(value)).catch(err => console.log(err))
    }
  4. Promise.allSettled(),无论成功还是失败,都会返回一个状态

async & await

async 函数错误处理

  1. 使用catch
    js
    async function f() {
      return Promise.reject('出错了')
    }
    f().catch(err => console.log(err))
  2. 捕获异常
    js
    async function f() {
      try {
        await Promise.reject('出错了')
      }
      catch (e) {
        console.log('捕获异常')
      }
    }
  3. 捕获多个异常
    js
    async function f() {
      try {
        await Promise.reject('出错了1')
        await Promise.reject('出错了2')
      }
      catch (e) {
        console.log('捕获异常')
      }
    }

await 并行执行

  1. 使用Promise.all
js
const p1 = () => new Promise(resolve => setTimeout(() => resolve('one'), 1000))
const p2 = () => new Promise(resolve => setTimeout(() => resolve('two'), 2000))
async function f() {
  const p = await Promise.all([p1, p2])
  console.log(p)
}
f()
  1. 使用 parallel
js
const p1 = () => new Promise(resolve => setTimeout(() => resolve('one'), 1000))
const p2 = () => new Promise(resolve => setTimeout(() => resolve('two'), 2000))
async function f() {
  const p = await Promise.allSettled([p1, p2])
  console.log(p)
}
f()
  1. 并行执行多个异步函数
js
const p1 = () => new Promise(resolve => setTimeout(() => resolve('one'), 1000))
const p2 = () => new Promise(resolve => setTimeout(() => resolve('two'), 2000))
async function f() {
  const r1 = p1()
  const r2 = p2()
  const r3 = await r1
  const r4 = await r2
  console.log(r3, r4)
}
f()