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 对象的错误。
- try catch 和 Promise 的 .catch 有什么区别?
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