Skip to main content

Promise 是什么?

是什么

Promise 是一个 JS 的异步编程解决方案,解决了传统异步编程回调地狱的问题。 从语义上来说:Promise 是一个向外部传达异步编程操作消息的对象。

Promise 常用 API

  • Promise.resolve:成功时调用 resolve(数据)
  • Promise.reject:失败时调用 reject(错误)
  • Promise.then
  • Promise.catch
  • Promise.finally
  • Promise.all
  • Promise.race[reɪs]

Promise 基本用法

Promise 构造函数接收的参数是一个函数,该函数有两个由 JS 指定的参数:resolve[rɪˈzɑːlv]函数 和 reject 函数,如果一切都正常,则调用 resolve,否则调用 reject。

function fn() {
return new Promise((resolve, reject) => {
//成功时调用 resolve(数据)
//失败时调用 reject(错误)
})
}

fn().then(success, fail).then(success2, fail2)

Promise 对象异步操作的三种状态

  • pending(进行中)
  • fulfilled[fʊlˈfɪld](已完成)
  • rejected(已失败)

Promise 对象三个实例方法

  • then (数据调用)

    then 方法分别指定 resolve 状态和 rejected 状态的回调函数:获取 Promise 内部的异步操作状态

  • catch (错误调用)

    用于指定发生错误时的回调函数,是 .then(null, rejection) 的语法糖

    • try catch 和 Promise 的 .catch 有什么区别?

      try catch 也是用来捕获错误的,Promise 拥有错误冒泡功能,虽然.then 返回的是一个新的对象,但是在.then 后面.catch 仍然可以捕获到最开始的那个 Promise 对象的错误。

  • finally[ˈfaɪnəli](最终调用)

    用于指定不管状态最终如何,都会执行的函数。

Promise.all

是什么

Promise.all(arr) 方法是挂载在 Promise 构造函数上的静态方法

Promise.all([promise1, promise2]).then(success1, fail1)

Promise.all 用法

  • Promise.all 方法接受一个数组作为参数,返回值为一个 Promise 实例
  • 只有所有参数的状态都变成成功,总状态才会变成成功,此时参数的返回值组成一个数组,传递给总的回调函数。
  • 只要参数之中有一个失败,总状态就变成失败,此时第一个被失败的实例的返回值,会传递给总的回调函数。

简而言之,都正确,都返回;有一个错误,返回错误

const promise1 = Promise.resolve(3)
const promise2 = 42
const promise3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'foo')
})

Promise.all([promise1, promise2, promise3]).then(values => {
console.log(values)
})
// expected output: Array [3, 42, "foo"]

Promise.race 用法

是什么

Promise.race (arr) 方法是挂载在 Promise 构造函数上的静态方法

Promise.race([promise1, promise2]).then(success1, fail1)

用法

  • Promise.race 方法接受一个数组作为参数,返回值为一个 Promise 实例
  • 只要参数之中有一个被成功,总状态就变成成功,此时第一个被成功的实例的返回值,会传递给总的回调函数。
  • 只要参数之中有一个被失败,总状态就变成失败,此时第一个被失败的实例 的返回值,会传递给总的回调函数。

简而言之,谁第一个成功或失败,就认为是 race 的成功或失败。

const promise1 = new Promise((resolve, reject) => {
setTimeout(resolve, 500, 'one')
})

const promise2 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'two')
})

Promise.race([promise1, promise2]).then(value => {
console.log(value)
// Both resolve, but promise2 is faster
})
// expected output: "two"

具体的内容参考我写的这篇文章:Promise

参考文章:JavaScript 异步解决方案 Promise 全解析