promise的原理和几种使用方法

这篇具有很好参考价值的文章主要介绍了promise的原理和几种使用方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  1. promise概念

    Promise 是异步编程的一种解决方案:从语法上讲,promise是一个对象,从它可以获取异步操作的消息;从本意上讲,它是承诺,承诺它过一段时间会给你一个结果,其实是一个构造函数,自己身上有all、reject、resolve,race这几个方法,原型上有then、catch,finally等方法。promise有三种状态: pending(等待态),fulfiled(成功态),rejected(失败态);状态一旦改变,就不会再变。创造promise实例后,它会立即执行。

  2. promise.prototytype.then():promise实例状态改变的回调函数,有两个参数:第一个是成功回调函数,第二个是失败回调函数。他会返回一个全新的promise,因此可以继续then链式调用。

  3. promise.prototype.catch():失败回调函数,状态变为rejected执行。相当于promise. prototytype.then(null/undifined,rejection),如果promise内发生了错误,但却没有定义catch(),这时运行到这一行代码会报错,但是不会影响到promise后面代码的执行

promise的几种方法:

1.基础用法:

new Promise((resolve, reject) => {
        // resolve 成功的回调
        // reject  失败的回调
        // 成功或者失败只能存在一种状态,不能同事执行两个状态
        resolve('成功')
        reject('失败')
        // then 是获取Promise的resolve, reject状态
    }).then(res => {
        // 成功
        console.log(res);
    }, error => {
        // 失败
        console.log(error);
    })

2.promise.finally():promise实例无论状态是什么都会执行的函数,finally不接受任何参数。

 const p1 = function () {
            return new Promise((resolve, reject) =>{
                // 失败时
                // reject("失败了")
                //  resolve(2);
                // 成功时
                resolve(2)
                reject("失败了")
            });
        };
        p1().then(res=> {
            console.log(res);
        }).catch(error=>{
            console.log(error);
        }).finally(()=>{
            console.log('无论失败或者成功都会走这个函数');
        })

3.promise.all():将多个promise实例包装成一个新的promise实例

const p1 = function () {
                    return new Promise((resolve, reject)=>{
                        resolve(1);
                    });
                };
                const p2 = function () {
                    return new Promise((resolve, reject)=>{
                        resolve(2);
                    });
                };
                const p3 = function () {
                    return new Promise((resolve, reject)=>{
                        // reject("失败了")
                        resolve(3);
                    });
                };

                // Promise.all 所有封装的Promise都成功才会成功,只要有一个失败就会失败
                let result = Promise.all([p1(), p2(), p3()]).then(results=>{
                    console.log(results);//[1, 2, 3]
                }).catch(error=>{
                    console.log(err);
                    // 当p3的reject("失败了")被解开时控制台会打印失败了
                })


              

4.promise.race():

// race()  把多个封装的promise 组合起来,看谁跑的快
        const p1 = function () {
            return new Promise((resolve, reject)=>{
                setTimeout(() => {
                    resolve(1);
                }, 500)

            });
        };
        const p2 = function () {
            return new Promise((resolve, reject)=>{
                setTimeout(() => {
                    resolve(2);
                }, 400)
            });
        };
        const p3 = function () {
            return new Promise((resolve, reject)=>{
                setTimeout(() => {
                    resolve(3);
                }, 600)
            });
        };
        //谁先执行完成就先执行回调,其余的将不会再进入race的任何回调,其余的没有停止,自行执行
        let result = Promise.race([p1(), p2(), p3()]).then(results=>{
            console.log(results);
        }).catch(error=>{
            console.log(error);
        })





5.promise.any():

 // 1. 只要有一个实例变成fulfilled,他就会变成fulfilled
        // 2. 只有全部实例状态都变成rejected,它才会变成rejected
  const p1 = function () {
            return new Promise((resolve, reject)=>{  
                resolve(5);
            });
        };
        const p2 = function () {
            return new Promise((resolve, reject)=>{
                reject(2);
            });
        };
        const p3 = function () {
            return new Promise((resolve, reject)=>{ 
                resolve(3);
            });
        };

        let result = Promise.any([p1(), p2(), p3()]).then(results=>{
            console.log(results);
            // 5 因为p1成功了,只返回找到的第一个成功的,遇到reject会继续向下寻找
        }).catch(error=>{
            console.log(error);
            // 当三个return返回的都是reject时,控制台打印AggregateError: All promises were rejected
        })

6.promise.allSettled():等所有实例都返回结果,他的状态就只会变成fulfilled文章来源地址https://www.toymoban.com/news/detail-407522.html

const p1 = function () {
        return new Promise((resolve, reject) => {
            resolve(1);
        });
    };
    const p2 = function () {
        return new Promise((resolve, reject) => {
            resolve(2);
        });
    };
    const p3 = function () {
        return new Promise((resolve, reject) => {
            reject(3);
        });
    };

    // Promise.allSettled无论成功或者失败会把所有的状态返回给results
    // 没有catch
    let result = Promise.allSettled([p1(), p2(), p3()]).then(results => {
        console.log(results);
    })

到了这里,关于promise的原理和几种使用方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux 查看内存使用情况的几种方法

    *以下内容为本人的学习笔记,如需要转载,请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/27UaVm5_FMhCnxB88pc0QA 在运行 Linux 系统的过程中为了让电脑或者服务器以最佳水平运行,常常需要监控内存统计信息。 那么今天我们就来看看有哪些方法可以访问所有相关信息

    2023年04月20日
    浏览(41)
  • 使用html网页播放多个视频的几种方法

            因为项目测试需要,我需要可以快速知道自己推流的多路视频流质量,于是我想到可以使用html网页来播放视频,实现效果极其简单,方法有好几种,以下是几种记录:         注意 :测试过,VLC需要使用360急速浏览器,于是以下都是基于360急速浏览器测试的: vi

    2024年04月28日
    浏览(41)
  • 分享Linux 查看内存使用情况的几种方法

    Linux 查看内存使用情况的几种方法包括使用 free 命令、top 命令、htop 命令、vmstat 命令和/proc/meminfo 文件。这些方法可以帮助用户了解系统内存的使用情况,包括总内存、已用内存、空闲内存、缓存和交换分区等信息。 在运行 Linux 系统的过程中为了让电脑或者服务器以最

    2024年02月04日
    浏览(49)
  • QTextDocument的使用方法及几种初始化方式

    qtextDocument并不像控件一样可以通过拖拽方式拉到设计器中使用,也不能直接声明就可以初始化使用,而是需要通过包涵库文件的方式包涵在当前的窗体文件中。 如: 上面说了Qtextdocument并不是控件,它是辅助配合QT中的文本编辑控件进行文本操作的类库。 QTextDocument在使用之

    2024年02月09日
    浏览(45)
  • Pytorch基本概念和使用方法

    目录 1 Adam及优化器optimizer(Adam、SGD等)是如何选用的? 1)Momentum 2)RMSProp 3)Adam 2 Pytorch的使用以及Pytorch在以后学习工作中的应用场景。 1)Pytorch的使用 2)应用场景 3 不同的数据、数据集加载方式以及加载后各部分的调用处理方式。如DataLoder的使用、datasets内置数据集的使

    2024年02月07日
    浏览(41)
  • 使用JavaScript关闭浏览器窗口的几种方法

    在Web开发中,有时候我们需要通过JavaScript来控制用户的浏览器行为,其中之一就是关闭浏览器窗口。本文将介绍几种使用JavaScript关闭浏览器窗口的方法,并提供相应的源代码示例。 使用window.close方法关闭窗口 要关闭当前窗口,可以使用window.close方法。这个方法会关闭当前浏

    2024年02月04日
    浏览(70)
  • 使用python判断字母大小写的几种方法

    使用Python中的内置函数 isupper() 和 islower() 来判断一个字母是否为大写或小写字母。 用户输入一个字母,程序使用isupper()和islower()函数判断字母是否为大写或小写,并输出相应的信息。如果用户输入了除字母以外的字符,程序会输出一个错误信息。 使用ASCII码值来判断字母大

    2024年02月04日
    浏览(59)
  • JDBC的概念、作用、使用方法等

    JDBC是Java Database Connectivity的缩写,它是一组用于Java编程语言中连接和操作数据库的API。JDBC API定义了一组标准接口,使Java应用程序能够与任何关系型数据库进行交互,如Oracle、MySQL、PostgreSQL、Microsoft SQL Server等。 JDBC的作用是允许Java应用程序通过JDBC API与数据库进行通信,以

    2024年02月09日
    浏览(57)
  • SVG 在前端的7种使用方法,你还知道哪几种?

    点赞 + 关注 + 收藏 = 学会了 技术一直在演变,在网页中使用 SVG 的方法也层出不穷。每个时期都有对应的最优解。 所以我打算把我知道的 7种 SVG 的使用方法列举出来,有备无患~ 如果你还知道其他方法,可以在评论区补充~ ```svg ``` xml 是浏览器能读取的格式,但如果希望 sv

    2024年02月06日
    浏览(49)
  • 【linux】Linux 查看内存使用情况的几种方法汇总

    Linux 查看内存使用情况的几种方法包括使用 free 命令、top 命令、htop 命令、vmstat 命令和/proc/meminfo 文件。这些方法可以帮助用户了解系统内存的使用情况,包括总内存、已用内存、空闲内存、缓存和交换分区等信息。 在运行 Linux 系统的过程中为了让电脑或者服务器以最佳水

    2024年02月04日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包