深入理解Promise

122 阅读3分钟

promise介绍

Promise 对象用于表示一个异步操作的最终完成(或失败)及其结果值
一个 Promise必然处于以下几种状态之一:
待定(pending):初始状态,既没有被兑现,也没被拒绝。
已兑现(fulfilled): 意味着操作成功完成。
已拒绝(rejected): 意味着操作失败。

promise的应用场景

解决回调地狱问题,可以把异步的代码写成同步的形式方便维护、阅读和管理。

promise的使用

//1.基本使用
let promise = new Promise((resolve,reject)=>{

})
console.log('promise', promise)
//[[Prototype]]: Promise
//[[PromiseState]]: "pending"
//[[PromiseResult]]: undefined
//刚创建出来的promise处于pending状态,结果为undfined


//2.让promise处于成功状态
let promise2 = new Promise((resolve, reject) => {
    resolve(10)
}).then((res)=>{
    console.log(res)//10
})
console.log('promise2', promise2)
//[[Prototype]]: Promise
//[[PromiseState]]: "fulfilled"
//[[PromiseResult]]: 10
//调用resolve函数改变PromiseState为fulfilled PromiseResult结果为10
//PromiseState为fulfilled后会调用then方法的第一个函数并把PromiseResult的值赋给res

//3.让promise处于失败状态
let promise3 = new Promise((resolve, reject) => {
    reject(20)
}).then((res) => {
    console.log(res)
},(reason)=>{
    console.log(reason)//20
    return Promise.reject('30')
}).catch(
    (reason) => {
        console.log(reason, Promise)//30
    }
)
console.log('promise3', promise3)
//[[Prototype]]: Promise
//[[PromiseState]]: "fulfilled"
//[[PromiseResult]]: undefined
//调用reject函数改变PromiseState为rejected PromiseResult结果为20
//PromiseState为fulfilled后会调用then方法的第二个函数并把PromiseResult的值赋给reason,通过返回新的promise改变PromiseState和PromiseResult,在调用catch方法
    

promise的方法

//静态方法
Promise.all()
Promise.allSettled()
Promise.any()
Promise.race()
Promise.reject()
Promise.resolve()
//原型方法
Promise.prototype.catch()
Promise.prototype.finally()
Promise.prototype.then()
reject方法
//返回一个带有拒绝原因的Promise对象
let p1 = Promise.reject('12345')
console.log(p1)
//[[Prototype]]: Promise
//[[PromiseState]]: "rejected"
//[[PromiseResult]]: "12345"
resolve方法
//返回一个以给定值解析后的Promise 对象
let p2 = Promise.resolve('123456')
console.log(p2)
//[[Prototype]]: Promise
//[[PromiseState]]: "fulfilled"
//[[PromiseResult]]: "123456"
race方法
返回一个 promise,一旦迭代器中的某个promise解决或拒绝,返回的 promise就会解决或拒绝。(返回失败成功)
let p3 = Promise.race([p1,p2])
console.log('p3',p3)
//[[Prototype]]: Promise
//[[PromiseState]]: "rejected"
//[[PromiseResult]]: "12345"
//p1先拒绝 返回p1的PromiseState和PromiseResult
any方法
接收一个Promise可迭代对象,只要其中的一个 promise 成功,就返回那个已经成功的 promise 。(返回成功)
const pErr = new Promise((resolve, reject) => {
  reject("总是失败");
});

const pSlow = new Promise((resolve, reject) => {
  setTimeout(resolve, 500, "最终完成");
});

const pFast = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, "很快完成");
});

Promise.any([pErr, pSlow, pFast]).then((value) => {
  console.log(value);//"很快完成"
})
all方法
方法接收一个promise的iterable类型的输入,并且只返回一个Promise实例,那个输入的所有promise的resolve回调的结果是一个数组(所有成功)
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"]

allSettled方法
const promise1 = Promise.resolve(3);
const promise2 = new Promise((resolve, reject) => setTimeout(reject, 100, 'foo'));
const promises = [promise1, promise2];

Promise.allSettled(promises).
  then((results) => results.forEach((result) => console.log(result)));
//{ status: "fulfilled", value: 3 }
//{ status: "rejected", reason: "foo" }
then方法
返回一个 Promise,它最多需要有两个参数:Promise 的成功和失败情况的回调函数。
catch方法
返回一个 Promise,状态未reject时执行
finally方法
在promise结束时,无论结果是fulfilled或者是rejected,都会执行指定的回调函数。

promise链式调用图

image.png