31、js - Promise

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

一、Promise要点

-> js中,只有Promise对象才可以使用.then().catch()方法。

-> axios可以使用.then().catch(),完全是因为调用axios(),返回的是一个Promise对象。

-> new Promise() 里面的代码是同步代码,一旦调用promise对象就会立即执行new Promise()里的代码。

-> 只有.then().catch()里面的回调函数才是异步代码

二、Promise的3种状态

1、作用:了解Promise对象如何关联的处理函数,以及代码执行顺序

2、一个Promise对象,必然处于以下几个状态之一:

pending:初始状态,页面一旦调用Promise对象,Promise对象就会立刻处于pending状态

fulfilled:意味着操作成功完成

rejected:意味着操作失败完成

3、注意⚠️:

Promise对象的状态一旦是fulfilled或者rejected,状态就无法再被改变,也就是说一旦是fulfilled状态,就无法再改为rejected状态。

->调用了resolve(),把状态改成了fulfilled,then()里面的代码就会自动执行.

->调用了reject(),把状态改成了rejected,catch()里面的代码就会自动执行.

例如:如果代码里同时写了resolve(3); reject(4); 最后只会执行resolve()方法,不会执行reject()方法。这就是Promise对象的状态一旦是fulfilled或者rejected,状态就无法再被改变。

31、js - Promise
    const p = new Promise((resolve, reject) => {

        setTimeout(() => {
             resolve(1);
            //reject(2);
        }, 3000);

    });

    console.log(p);

    p.then(data => {
        console.log(data);
    }).catch(error => {
        console.log("我是Promise错误", error);
    })

一运行js,js会马上打印p对象,如果此时3秒内立马点击控制台的Promise对象,就是处于pending状态。也就是说,页面一旦调用Promise对象,Promise对象就会立刻处于pending状态。

31、js - Promise

就算3秒后setTimeout运行完了,也依然是pending状态。

31、js - Promise

只有当3秒后setTimeout运行完了,你再点击控制台的Promise对象,才会显示对应的fulfilled或者rejected状态。

31、js - Promise
31、js - Promise
    const p = new Promise((resolve, reject) => {

        setTimeout(() => {
            resolve(3);
            reject(4);
        }, 3000);

    });

    console.log(p);

    p.then(data => {
        console.log(data);
    }).catch(error => {
        console.log("我是Promise错误", error);
    })

如果代码里同时写了resolve(3); reject(4); 最后只会执行resolve()方法,不会执行reject()方法。这就是Promise对象的状态一旦是fulfilled或者rejected,状态就无法再被改变。

31、js - Promise

三、Promise的链式调用

解决回调函数地狱问题

做法:在每一个.then()方法里面return一个Promise对象

new Promise((resolve, reject) => {
        resolve(1);
    }).then(res => {
        console.log(res); // 1
        return new Promise((resolve, reject) => {
            resolve(res + 2);
        })
    }).then(res => {
        console.log(res); // 3
        return new Promise((resolve, reject) => {
            reject(res + 2);
        })
    }).then(res => {
        console.log(res); // 因为上面有reject,所以这里不会再执行
    }).catch(error => {
        // 上面任意一个promise对象发生错误都会在这里进行捕获
        // 一旦发生reject,后面的promise对象的.then()将不会再执行
        console.log("error", error); // error 5
    })

上面的代码相当于下面这样写:

    const a1 = new Promise((resolve, reject) => {
        resolve(1);
    });

    const a2 = a1.then(res => {
        console.log(res); // 1
        return new Promise((resolve, reject) => {
            resolve(res + 2);
        });
    });

    const a3 = a2.then(res => {
        console.log(res); // 3
        return new Promise((resolve, reject) => {
            resolve(res + 2);
        });
    });

    const a4 = a3.then(res => {
        console.log(res); // 5
    });

四、Promise.all()

Promise的静态方法 Promise.all()

作用:高并发处理,同时发送请求,可以做到在所有请求都得到结果后再统一渲染页面数据

语法:Promise.all([p1, p2, p3, p4]) all方法里传一个数组,数组由多个Promise对象组成

返回结果:会返回一个新的Promise对象,.then()得到的结果是all()方法里多个Promise对象的结果组成的数组,.catch()方法里只要有一个请求发生错误就会走catch文章来源地址https://www.toymoban.com/news/detail-477007.html

    const p1 = axios({
        url: 'http://hmajax.itheima.net/api/weather',
        params: {
            city: '110100'
        }
    })

    const p2 = axios({
        url: 'http://hmajax.itheima.net/api/weather',
        params: {
            city: '110100'
        }
    })

    const p3 = axios({
        url: 'http://hmajax.itheima.net/api/weather',
        params: {
            city: '110100'
        }
    })

    const result = Promise.all([p1, p2, p3]).then(res => {
        console.log(res);
    }).catch(error => {
        // 只要有一个请求发生错误就会走catch
        console.log(error);
    })

到了这里,关于31、js - Promise的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • JS中使用Promise.all控制所有的异步请求都完成后,在执行后续逻辑

    使用场景为,在js中连续的几个异步耗时操作,后面的耗时操作需要使用第一个操作的返回结果。例如调用ajax异步接口,需要先创建完主表,然后拿到主表id在去循环创建明细表,等全部创建完成后,弹出提示来,或者失败提示。 通常情况,在耗时操作完成后在去调用,需要

    2024年02月13日
    浏览(44)
  • 【100天精通python】Day31:使用python操作数据库_数据库编程接口,连接对象和游标对象,数据库连接配置

    目录  专栏导读  一、数据库编程接口 1. Python标准库接口 2. MySQL Connector/Python接口

    2024年02月13日
    浏览(50)
  • Day31:安全开发-JS应用&WebPack打包器&第三方库JQuery&安装使用&安全检测

    目录 打包器-WebPack-使用安全 第三方库-JQuery-使用安全 思维导图 JS知识点: 功能:登录验证,文件操作, SQL 操作,云应用接入,框架开发,打包器使用等 技术:原生开发, DOM ,常见库使用,框架开发( Vue , NodeJS ),打包器 ( Webpack ) 等 安全:原生开发安全, NodeJS 安全,

    2024年03月14日
    浏览(53)
  • 前端异步编程 —— Promise对象

    在前端编程中,处理一些简短、快速的操作,在主线程中就可以完成。 但是,在处理一些耗时比较长以至于比较明显的事情,比如读取一个大文件或者发出一个网络请求,就需要异步编程来实现,以避免只用主线程时造成页面一时无法响应的事情。 以发送网络请求为例,在

    2024年02月08日
    浏览(71)
  • 前端多线程处理 —— Promise对象

    在前端编程中,处理一些简短、快速的操作,在主线程中就可以完成。 但是,在处理一些耗时比较长以至于比较明显的事情,比如读取一个大文件或者发出一个网络请求,就需要异步编程来实现,以避免只用主线程时造成页面一时无法响应的事情。 以发送网络请求为例,在

    2024年02月08日
    浏览(58)
  • ES6---Promise对象

    前端的一个必学知识之一,Promise对象,是一种用来解决异步编程的方案 特点: 1.对象的状态不受外界影响。 Promise对象代表一个异步操作,有三种状态: pending(进行中)、 fulfilled(已成功)和 rejected(已失败)。 只有异步操作的结果,可以决定当前是哪一种状态,任何其

    2024年02月08日
    浏览(33)
  • 【ES6知识】Promise 对象

    1.1 概述 Promise 对象用于表示一个异步操作的最终完成(或失败)及其结果值。是异步编程的一种解决方案(可以解决回调地狱问题)。 一个 Promise 对象代表一个在这个 promise 被创建出来时不一定已知值的代理。它让你能够把异步操作最终的成功返回值或者失败原因和相应的

    2024年02月07日
    浏览(43)
  • 为什么魂斗罗只有 128KB 却可以实现那么长的剧情

      A :为什么你用 128KB 能实现这么多画面、音乐、动画? B : 128KB 还不够么?其实为了表现力已经相当奢侈了,加了很多不重要的细节。 A :就说你们的音乐,这个音乐,我压到最低码率的 mp3 ,也得至少 1MB 吧。 B :你怎么压的?一首背景音乐怎么可能超过 1KB 。 A :那你实

    2024年02月07日
    浏览(46)
  • day 31 面向对象 成员方法

     class 类名称:                                   类的属类(定义在类中的变量,成员变量)            类的行为(定义在类中的函数,成员方法)  def  方法名(self,参数...... ):         方法体 self是成员方法定义必须写的,用来表示对象自身的意思,当

    2024年02月10日
    浏览(36)
  • 安装 fcitx + 搜狗/谷歌输入法 之后导致 死机,重启后黑屏只有鼠标可以移动

    一般的原因就是 : fcitx 导致的问题 方法就是 先卸载搜狗,再卸载fcitx 解决办法: 首先:ctrl+alt+F6 进入命令行界面,如果进不去就 ctrl+alt+F2 接下来执行: 参考:[安装fcitx和搜狗输入法后]Ubuntu18.04开机全黑屏,只有鼠标可移动_ubuntu 安装fcitx黑屏-CSDN博客

    2024年02月08日
    浏览(70)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包