• promise详解


    promise是什么

    promise 是异步编程的一种解决方案:
    从语法上,promise是一个对象,从它可以获取异步操作的消息;
    从功能上,promise对象是用来封装一个异步操作并可以获取其结果数据
    从意义上,它是承诺,承诺过一段时间会给你一个结果;

    promise的优点

    解决回调导致的代码难以维护

    在使用js时,为了实现某些逻辑经常会写出层层嵌套的回调函数,如果嵌套过多,会极大影响代码可读性和逻辑,这种情况也被称为回调地狱:
    在这里插入图片描述

    // 优化前
    var sayhello = function (name, callback) {
      setTimeout(function () {
        console.log(name);
        callback();
      }, 1000);
    };
    sayhello("first", function () {
      sayhello("second", function () {
        sayhello("third", function () {
          console.log("end");
        });
      });
    });
    // 优化后
    var sayhello = function (name) {
      return new Promise(function (resolve, reject) {
        setTimeout(function () {
          console.log(name);
          resolve(); //在异步操作执行完后执行 resolve() 函数
        }, 1000);
      });
    };
    sayhello("first")
      .then(function () {
        return sayhello("second"); //仍然返回一个 Promise 对象
      })
      .then(function () {
        return sayhello("third");
      })
      .then(function () {
        console.log("end");
      });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    可读性

    promise规范了这种异步场景的代码,相对于callback的方式,更加清晰易懂,语义化更强

    可靠性

    promise是原生支持的API,在各大浏览器中的运行机制是相同的,这保证了它的可靠性

    信任问题

    只能决议一次,决议值只能有一个,决议后无法改变;
    任何then中的回调也只能被调用一次

    promise的三种状态

    • pending:初始状态,既不是成功,也不是失败状态
    • fulfilled:操作成功
    • rejected:操作失败
      pending 状态的 Promise 对象可能会变为 fulfilled 状态并传递一个值给相应的状态处理方法,也可能变为失败状态 (rejected) 并传递失败信息。当其中任一种情况出现时,Promise 对象的 then 方法绑定的处理方法就会被调用

    兼容性

    对低版本不支持的浏览器可以使用开源的 polyfill 解决

    基础使用方式

    const p = new Promise((resolved, reject) => {
      setTimeout(function () {
        // resolved('成功'); //promise变为resolve成功状态
        // or
        reject("失败"); //promise变为rejected失败状态
      }, 1000);
    });
    p.then(
      (value) => {},
      (reason) => {
        console.log("reason", reason);
      }
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    Promise接口

    prmose.prototype.then

    返回一个新的Promise,

  • 相关阅读:
    K8S搭建共享存储(以MySQL例)
    [ vulhub漏洞复现篇 ] Apache Solr RemoteStreaming 文件读取与SSRF漏洞 (CVE-2021-27905)
    Avalonia 部署到麒麟信安操作系统
    使用 Ant Design Vue 你可能会遇到的14个问题
    数字化转型升级必备—数据思维与应用
    开发知识点-Pygame
    【升级版学生信息管理系统&员工工资信息管理系统】+文件操作+更多细节
    Ubuntu 23.04存在一个32位程序支持错误
    技术公司职位
    如何用springboot写自定义查询数据库字段以及根据传入字段写增删改查方法
  • 原文地址:https://blog.csdn.net/hr_beginner/article/details/126239725