首页 > 编程语言 >JavaScript中Promise详解

JavaScript中Promise详解

时间:2022-09-27 16:00:26浏览次数:53  
标签:resolve console log JavaScript 详解 Promise reject catch

概述

Promise (期约) 对象用于表示一个异步操作的最终完成(或失败)及其结果值。

Promise的使用

Promise创建时需传入一个 执行器函数(excutor) 接受两个参数,第一个参数是内部定义成功状态时调用的函数(习惯命名为resolve),第二个参数是内部定义失败状态时调用的函数(习惯命名为reject)

let promise = new Promise((resolve, reject) => {
    if (status >= 200 && status < 300) {
        resolve('成功了');
    } else {
        reject('失败了');
    }
});

执行器函数中的代码为同步代码,会立即同步调用,resolve() 或 reject() 只能指定一次状态,如果调用多个resolve() 和 reject(),则以第一个为准,后面的不会执行

Promise的三种状态

Promise实例身上有两个属性,如下:

PromiseState属性即为实例的状态,它必然处于以下几种状态之一:

  • pending:初始状态,既没有被兑现,也没有被拒绝。
  • fulfilled:意味着操作成功完成。
  • rejected:意味着操作失败。

通过 resolve 或 reject 指定状态后,会自动调用对应的 then() 方法或 catch() 方法,传入 resolve 或 reject 的参数将作为 then() 或 catch() 中回调函数的参数

then()方法

then() 方法可接受两个参数,第一个参数作为处理成功状态的回调函数,而第二个参数则作为处理失败状态的回调函数。每一个 then() 方法还会返回一个新生成的 promise 对象,这个对象可被用作链式调用

    let promise = new Promise((resolve, reject) => {
        let status = 202; //或304
        if (status > 200 && status < 300) {
          resolve('请求成功了');
        } else {
          reject('请求失败了');
        }
      });
      promise.then(
        (value) => {
          console.log('成功:' + value);
        },
        (error) => {
          console.log('失败:' + error);
        }
    );

当status为202时第一个回调被调用

 当status为304时第二个回调被调用

catch()方法

catch() 方法接受一个参数,作为处理失败状态的回调函数。每一个 catch() 方法还会返回一个新生成的 promise 对象,这个对象可被用作链式调用

    let promise = new Promise((resolve, reject) => {
        let status = 304;
        if (status > 200 && status < 300) {
          resolve('请求成功了');
        } else {
          reject('请求失败了');
        }
      });
      promise.catch((error) => {
        console.log(error);
    });

链式调用

链式调用的过程中 then() 方法或 catch() 方法的回调的返回值会作为下一个 then() 方法的回调的参数,无返回值也可继续 .then(),如果没有错误,catch 方法将发生穿透。

      new Promise((resolve, reject) => {
        resolve('请求成功了');
      })
        .then((value) => {
          console.log(value);
          return new Error('错误');
        })
        .catch(() => {
          console.log('错误'); //未打印,发生穿透
        })
        .then((value) => {
          console.log(111);
        })
        .then((value) => {
          console.log(222);
        })

 

若通过throw抛出错误,后面如果有 catch 则会进入 catch 方法,catch 前面的 then 方法将发生穿透,后面如果没有 catch 方法Promise将止步于报错的那一行

      new Promise((resolve, reject) => {
        resolve('请求成功了');
      })
        .then((value) => {
          console.log(value);
          throw new Error('错误');
        })
        .then((value) => {
          console.log(111); //未打印,发生穿透
        })
        .catch((error) => {
          console.log(error);
        })
        .then((value) => {
          console.log(222);
        });

 

标签:resolve,console,log,JavaScript,详解,Promise,reject,catch
From: https://www.cnblogs.com/qianduanLamp/p/16637048.html

相关文章

  • JavaScript DOM
    APIAPI(ApplicationProgrammingInterface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,......
  • HttpServletRequest详解
    链接:https://blog.csdn.net/wwq0813/article/details/90256058链接:https://www.cnblogs.com/wuxu/p/10902132.html ......
  • 免费综合网络研讨会:如何优化 JavaScript 应用程序的方法
    免费综合网络研讨会:如何优化JavaScript应用程序的方法您是否考虑过提高JavaScript应用程序的性能?加入DmytroMezhenskyi,开发专家解码前端,上2022年9月30......
  • JavaScript入门到精通
    JavaScript参考文章:https://www.yuque.com/u21195183/phhed3https://developer.mozilla.org/zh-CN/docs/Learn/JavaScripthttps://www.w3school.com.cn/js/index.asp......
  • 详解验证码与打码平台的攻防对抗
    众所周知,验证码的出现是为了区分人和机器,但随着科技的发展,黑产从业者的可图之利增多,验证码的战场也进入了一段破解与抗破解的持久博弈。验证码在逐渐复杂的同时,黑灰产的攻......
  • Convert gif to Base64 String Using JavaScript
    letxhRequest=newXMLHttpRequest();xhRequest.onload=function(){letreader=newFileReader();reader.onloadend=function(){......
  • mysql_config_editor命令详解
    1.为了方便登录数据库查询数据,需要配置mysql登录的快捷方式[root@localhostmysql]#mysql_config_editorset--login-path=db_admin--host=192.168.1.110--user=root......
  • 学习:网络基础知识-Https协议详解
    HTTP协议问题:发送数据都是明文的;如果第三者窃听截取数据包伪装成客户端与服务器进行交互服务器没有认证机制来确定客户端的身份客户端也没有任何机制确认服务器的身份;没......
  • 分布式ID详解(5种分布式ID生成方案)
    分布式架构会涉及到分布式全局唯一ID的生成,今天我就来详解分布式全局唯一ID,以及分布式全局唯一ID的实现方案@mikechen什么是分布式系统唯一ID在复杂分布式系统中,往往需......
  • JavaScript 数组
    数组是一组数据的集合,其中每个数据被称作元素,在数组中可以存放任意类型的元素。数组是一种将数据存储在单个变量名下的优雅方式。数组中可存放任意类型:字符串、数字、布尔......