promise基础知识整理(干货)

63 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

一、promise含义

抽象表达:js中进行异步编程的解决方法(以前是纯回调)

     具体表达:从语法上讲promise是一个构造函数,功能上来说:promise对象用来封装一个异步操作并可以获取其结果。

二、promise 的状态改变

从pending变为fulfilled(成功)
从pending变为rejected(失败)

一个promise对象只能改变一次,成功或者失败都有一个结果数据,成功是结果是value,失败的结果是reason.

new Promise((resolve,reject) => {
    resolve()            //padding(待定)
    reject()
}).then(res => {
    console.log(res)        //resolved(成功)
}).catch(err => {
    console.log(err)          //rejected(失败)
})

三、使用方法

       // Promise里面传入执行器函数
        new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve("成功的数据");
                reject("失败的数据");
            }, 0)
        }).then(
            // 成功的回调
            value => {
                console.log("onResolved", value);
            }
        ).catch(
            // 失败的回调
            reason => {
                console.log("onRejected", reason);
            }
        )
resolve传参
  • 传入一个字符串,padding - resolved
  • 传入一个Promise,状态由新传入的Promise状态决定
  • 传入一个对象,并且对象中实现了then方法,会执行then方法,并且由then方法决定后续状态。

image.png

四、为什么要使用promise

  1. 指定回调函数的方式更灵活:旧的在启动异步任务前指定回调函数,promise任何时期都可以,执行结果之后也可以
  2. 支持链式调用,可以解决回调地狱问题(回调函数嵌套调用,外部回调函数异步执行的结果是嵌套的回调函数的执行条件)

回调地狱不便于阅读和异常处理:promise链式调用(还有回调函数),async/await

五、promise的作用

  1. 主要用于异步计算
  2. 可以将异步操作队列化,按照期望的顺序执行,返回符合预期的结果
  3. 可以在对象之间传递和操作promise

六、promise对象方法

then-成功时调用
const promise = new Promise((resolve, reject) => {
  resolve(1);
});
promise.then((res) => {
  console.log(res);
});
promise.then((res) => {
  console.log(res);
    return 'ccc'
}).then(re => {
    console.log(re)
})
//多次调用then方法,都会执行

then传入的回调函数可以有返回值

  • then方法本身有返回值,是一个Promise对象
  • 如果返回一个普通值,这个值会被做为一个新的Promise的resolve值
catch-失败时候调用
finally-无论是resolve状态还是reject状态都会执行
const promise = new Promise((resolve, reject) => {
  resolve(1);
});

promise
  .then((res) => {
    console.log(res);
  })
  .catch((err) => {
    console.log(err);
  })
  .finally(() => {
    console.log("finally");
  });

七、类方法

resolve
const obj = {name:'123'}
const promise = Promise.resolve(obj)
promise.then(res => {
    console.log(res)
})
reject
all--传入的所有promise状态都变成resolved时候在执行
const p1 = new Promise((resolve,reject) => {
    resolve(1111)
})
Promise.all([p1,p2,p3,'aaa']).then(res => {
    console.log(res)  //返回结果的数组
})
allSettled --传入的所有promise状态都变成resolved或rejected时候在执行
race(竞赛) -- 传入的所有promise状态中一个变成resolved时候就执行,有一个为reject,就是执行catch
Promise.race([p1,p2,p3]).then(res => {
    console.log(res)  //返回结果的数组
})
any -- 等到有一个resolve的时候执行;如果全部为reject,所有的状态变为rejected时候在执行catch
any -- 等到有一个resolve的时候执行;如果全部为reject,所有的状态变为rejected时候在执行catch