对于Promise的理解?

本文详细介绍了ES6中的Promise概念,包括其作用、状态变化、工作流程及静态与实例方法等内容。通过具体示例,帮助读者理解如何使用Promise来简化异步编程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、Promise是什么?

Promise是ES6新增的一个构造函数,用来解决开发中的回调地狱问题.

回调地狱:异步回调 层层嵌套

2、状态

promise对象仅有三种状态:

  1. pending(进行中)
  2. fulfilled(已成功)
  3. rejected(已失败)

Promise对象是一个构造函数,用来生成Promise实例

const promise = new Promise(function(resolve, reject) {});

Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject

  • resolve函数的作用是,将Promise对象的状态从“未完成”变为“成功”
  • reject函数的作用是,将Promise对象的状态从“未完成”变为“失败”

promise本身并没有改变异步的顺序, 而是通过操作异步结果的顺序从而间接控制异步的顺序.

3、工作流程

当我们创建promise的时候,它就会立即执行里面的异步代码,此时它的状态是进行中,然后剩下两种状态是由异步本身决定的,分别对应的是异步操作的成功和失败,当成功或失败之后,promise的状态就会发生改变,从进行中到成功(从pending变为fulfilled)或者从进行中到失败(从pending变为rejected),这时候就会分别调用它的resolve()和reject()方法来处理异步的结果,resolve()就会执行promise实例的then方法,reject就会执行promise实例的catch()方法,这就是整个流程。

4、静态方法

  1. reslove()

resolve:异步操作 成功状态===>调用.then方法

  1. reject()

reject : 异步操作 失败状态===>调用.catch方法

  1. all()
const fs = require("fs");
/* 
1. promise实例对象的all方法 : 将多个Promise合并成一个Promise
    * 所有异步全部执行完毕才会执行then方法

2. 解决需求: a , b , c 同时执行完毕
*/

//1.封装一个函数 :  根据文件名生成  文件读取的promise
function getPromise(fileName) {
    let p = new Promise((resolve, reject) => {
        //读文件
        fs.readFile(`./data/${fileName}.txt`, 'utf-8', (err, data) => {
            if (err == null) {
                //成功
                resolve(data);
            } else {
                //失败
                reject(err);
            }
        });
    });
    return p;
};

//2.解决需求: a , b , c 同时执行完毕
let pa = getPromise('a');
let pb = getPromise('b');
let pc = getPromise('c');
//将三个异步操作合并成一个Promise
let pAll = Promise.all([pa,pb,pc]);

//开始读取a
// 三个promise都成功后,才去执行pAll.then的第一个方法.
// 只要有一个失败了,就去执行catch里面的函数.
pAll.then((data)=>{
    console.log(data);//data是一个数组,存储每一个promise的成功结果
}).catch((err)=>{
    console.log(err);
});

将多个promise实例合并成一个promise,只有所有的promise全部执行成功后才会执行then,promise.all调用成功返回的结果是每个promise单独调用成功之后返回的结果组成的数组,如果调用失败的话,返回的则是第一个reject的结果

  1. race()
const fs = require("fs");

/* 
1. promise实例对象的race方法 : 将多个Promise合并成一个Promise
    * 任何一个异步  执行完毕就会执行then方法

2. 解决需求: a , b , c 任意一个成功
*/

//1.封装一个函数 :  根据文件名生成  文件读取的promise
function getPromise(fileName) {
    let p = new Promise((resolve, reject) => {
        //读文件
        fs.readFile(`./data/${fileName}.txt`, 'utf-8', (err, data) => {
            if (err == null) {
                //成功
                resolve(data);
            } else {
                //失败
                reject(err);
            }
        });
    });
    return p;
};

//2.解决需求: a , b , c 同时执行完毕
let pa = getPromise('a');
let pb = getPromise('b');
let pc = getPromise('c');
//将三个异步操作合并成一个Promise
let pAll = Promise.race([pa,pb,pc]);

//开始读取a
// 三个promise任何一个成功,就去执行pAll.then的第一个方法.  (一旦成功一个,其他不再执行)
pAll.then((data)=>{
    console.log(data);//data是第一个执行成功的primise异步结果
}).catch((err)=>{
    console.log(err);
});

将多个promise实例合并成一个promise,任意promise执行成功就会执行then,返回的结果则是所有promise实例中最先返回的结果,不关心是成功还是失败.

5、实例方法

  1. then()

then是实例状态发生改变时的回调函数,第一个参数是resolved状态的回调函数,第二个参数是rejected状态的回调函数

then方法返回的是一个新的Promise实例,也就是promise能链式书写的原因

promise对象.then((res)=>{ 处理成功数据 },(err)=>{ 处理失败信息 });

  1. catch()
    catch()方法是.then(null, rejection)或.then(undefined, rejection)的别名,用于指定发生错误时的回调函数
  2. finally()
    finally()方法用于指定不管 Promise 对象最后状态如何,都会执行的操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值