Promise详解

2023-10-31

1.基本概念:

Promise是JS异步编程中的重要概念, 异步抽象处理对象,是目前比较流行Javascript异步编程解决方案之一

2.Promise的三种状态:

pending:对象初始化状态
fulfilled:当调用resolve(成功),会由pending => fulfilled
rejected:当调用reject(失败),会由pending => rejected

3.创建Promise

3.1 new Promise(resolve, reject);

const promise = new Promise((resolve, reject) => {
   resolve('fulfilled'); // 状态由 pending => fulfilled
    //reject('rejected'); // 状态由 pending => rejected
});

//then 在Promise 状态发生改变时触发
promise.then(result => { // onFulfilled  resolve被调用会进入
    console.log(result); }, 
    reason => { // onRejected ,reject被调用会进入
})

3.2 Promise的静态方法创建

3.2.1 Promise.resolve() 返回一个fulfilled状态的promise对象

3.2.2 Promise.reject() 返回一个rejected状态的promise对象

Promise.reject() 不管传给它什么值,它会直接把这个值传递给错误回调函数。

Promise.resolve() 如何执行取决于传递的参数。

1)传普通类型(数值等)

           let p1 = new Promise(resolve => {
                resolve('成功');
            })
            //和上面是等价的
            let p2 = Promise.resolve('成功');  //会直接决议为成功并把这个值传递过去
            

2)Promise类型:

let param = new Promise( resolve =>{
                resolve('----resolve----')
            })
            //直接返回传递进去的promise
            let p = Promise.resolve(param);  //直接将param实例返回给了p
            p.then(data => {console.log(data)})  //后打印结果为----resolve----
            console.log( p === param)  //打印true,虽然在p.then的下方但是由于Promise异步执行会先打印打印true
            

在这里插入图片描述

3) 传递一个thenable对象

let  obj = {  //obj是一个thenable对象
                then(callback){
                    console.log('-----then---------');
                    callback('-------callback-----')  
                },
                other(){
                    console.log('--------other---------')  //不打印
                }
               
            }

Promise.resolve(obj)

执行结果:
在这里插入图片描述

Promise.resolve(obj).then(data => {
                console.log(data)
            })

执行结果:

在这里插入图片描述

结论:传进含有then方法的对象时,会立即执行then方法,如果then方法中有回调的时候也会执行(callback(‘-------callback-----’) 会被当成参数去替换 then(data => {
console.log(data)
}) 中的data, 在调用then()时被执行)

resolve(data)的参数会被当做then(data)的参数执行。

如果理解有偏差,请大家多多指正。

4.异步在ES6的应用

ES6 中新加入了 asyncawait 两个语法糖支持异步

**async:**注明这个方法是异步方法,方法返回值会被包装成promise对象。
**await:**只能在async标注的方法里面使用,用于同步等待异步方法返回,如果抛出异常需要用try catch接收

1)await 接收抛出异常的异步方法

 async test() {
      throw new Error('出现异常')
    },
   async test2(){
      try {
        let a = await this.test()
        console.log('data:' + JSON.stringify(a))
      } catch (e) {
        console.error('异常被捕获')
      }
   } 

运行 test2() 测试结果:
在这里插入图片描述

2)await 接收正常返回的异步方法

  async test() {
      return {
        id: 1,
        age: 2
      }
    },

结果:
在这里插入图片描述

3)不使用await接收抛出异常的async 方法

async test2() {
      const a = this.test()
      console.log('-----------执行前 a:-------------', JSON.stringify(a))
      a.then(data => {
       console.log('data:' + JSON.stringify(data))
      }).catch(e => {
        console.error(' test2:', e)
      })

},

async test() {
     throw new Error('异常')
      return {
        id: 1,
        age: 2
      }
    },

结果:
异步返回值为promise对象且状态为 rejected,然后被catch方法捕获
在这里插入图片描述

4)不使用await接收正常返回的async 方法

  async test() {
      return {
        id: 1,
        age: 2
      }
    },

结果:

返回了promise 对象状态为fulfilled 触发then方法。
在这里插入图片描述

  1. await 只会阻塞async 修饰的方法里面的执行,并不会阻塞主线程,test() 和test2() 方法里面是阻塞的,test3() 方法没有被阻塞。

async function test() {
    console.log(  await wait(200))
    console.log('111111')
}

async function test2() {
console.log(  await wait(1000))
console.log('222222222')
}

function wait(ms) {
  return new Promise(resolve => { setTimeout(() => resolve(123 + ms), ms)
})
}

   function test3(){
        test2()
        test()
        console.log("123")
      }

      test3()
VM805:19 123
undefined
VM805:2 323
VM805:3 111111
VM805:7 1123
VM805:8 222222222

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Promise详解 的相关文章

  • dojo dijit.form.DateTextBox 约束不起作用,datetextbox

    嗨 我是 javascript 和 dojo 的新手 我正在尝试使用两个带有下拉日历的 dijit DateTextBox 来建立数据库查询的日期范围 一旦选择了开始日期或结束日期 我想限制可用的日期 以便不可能选择按时间顺序排列在开始日期
  • 在 javascript/jquery 中将光标更改为等待

    当调用函数时 如何让光标更改为此加载图标以及如何将其更改回 javascript jquery 中的普通光标 在你的 jQuery 中使用 body css cursor progress 然后又恢复正常 body css cursor d
  • 关闭选项卡时要求确认[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 当我在某些浏览器上关闭页面时 我希望出现一个消息框 并询问我是否真的要关闭页面 有两个按钮 如果我单击No那么这个标签就不会被关闭 我怎样
  • React js Stripe 结账不起作用

    我正在尝试在 React js 应用程序中呈现条带结账默认表单
  • 了解设置 JQuery 变量

    了解设置 JQuery 变量 最近 我通过在 StackOverflow 上遇到的另一个问题寻找帮助 了解到如何设置 JQuery 变量 如下所示 您可以通过简单地调用变量来创建输入字段 并且锚变量似乎也定义了样式 var clicked
  • 每 3 秒重复一次动画

    我正在使用 WOW js 和 animate css 现在我正在将 CSS 运行到 Infinite 我想知道如何让我的课程运行 3 秒停止并再次开始到无限 My html img src images fork png class for
  • 尝试将布尔 C# 变量传递给 javascript 变量并将其设置为 true

    在我的 aspx 页面中 我将布尔变量 C 传递给需要布尔类型的 javascript 函数 但遇到了问题 但是 C 变量返回 True 而 javascript 不喜欢大写 myjavascript 如果我将 c 变量转换为字符串 那么我
  • jquery.find() 可以只选择直接子项吗?

    我应该向 jQuery find 提供什么参数来选择元素子元素而不选择其他元素 我不能用 gt 引导选择器 而用 将选择所有后代 而不仅仅是直接子代 我知道 jQuery children 但这是一个库 因此用户能够提供自己的选择器 并且我
  • TypeError: props.render 不是一个函数(React hook 形式)

    我将方法作为我用react hook form制作的形式的道具传递 当从react hook form添加控制器时 它给了我 TypeError props render不是一个函数 我在网上找不到任何解决方案 因此感谢任何帮助 impor
  • 如何重定向到 instagram://user?username={username}

    我的 html 页面上有这个链接 可以在特定用户上打开 Instagram 应用程序 a href Link to Instagram Profile a 我一直在寻找自动运行 url instagram user username USE
  • 如何防止 Iframe 在与浏览器交互后弄乱浏览器的历史记录?

    因此 就我而言 我使用 Iframe 将 Grafana 附加到我的页面 这为我提供了漂亮且易于使用的图表 可以注意到 每次在图表上进行放大或缩小 使用鼠标单击 交互后 Grafana 的 Iframe 都会在我的 Angular 页面上触
  • 如何抑制窗口鼠标滚轮滚动...?

    我正在开发嵌入页面中的画布应用程序 我有它 因此您可以使用鼠标滚轮放大绘图 但不幸的是 这会滚动页面 因为它是文章的一部分 当我在 dom 元素上滚动鼠标滚轮时 是否可以阻止鼠标滚轮在窗口上滚动 附加鼠标滚轮 不是 Gecko DOMMou
  • Jquery/Javascript 上传和下载文件,无需后端

    是否可以在没有后端服务器的情况下在 JavaScript 函数中下载和上传文件 我需要导出和导入由 JavaScript 函数生成的 XML 我想创建按钮 保存 xml 来保存文件 但我不知道是否可行 另一方面 我希望将 XML 文件直接上
  • 将div设置为隐藏,延时后可见

    我试图在 X 时间后 也许甚至在随机时间之后 但现在我们只做固定时间 在黑色背景上出现一个黄色方块 function initialSetup if document getElementById yellow null document
  • Javascript 数组到 VBScript

    我有一个使用 Javascript 构建的对象数组 我需要使用 VBScript 读取它 如下例所示 我找不到在 VbScript 代码中循环遍历数组的方法myArray object 这个例子是我的问题的简化 我无法更改页面的默认语言 这
  • 为什么在 Internet Explorer 中访问 localStorage 对象会引发错误?

    我正在解决一个客户端问题 Modernizr 意外地没有检测到对localStorageInternet Explorer 9 中的对象 我的页面正确使用 HTML 5 文档类型 并且开发人员工具报告该页面具有 IE9 的浏览器模式和 IE
  • 有没有办法阻止 prettier / prettier-now 将函数参数分解为新行

    当使用 prettier prettier now 在保存时进行格式化时 当一个函数包装另一个函数时 它会中断到一个新行 我想知道是否有办法阻止这种行为 例如 期望的输出 app get campgrounds id catchAsync
  • Javascript 纪元时间(以天为单位)

    我需要以天为单位的纪元时间 迄今为止 我已经看到过有关如何翻译它的帖子 但几天后就没有了 我对纪元时间很不好 我怎么能得到这个 我需要以天为单位的纪元时间 我将解释为您想要自纪元以来的天数 纪元本身是第 0 天 或第 1 天的开始 无论您如
  • 为什么 jquery 没有检测到单选按钮未被选中的情况? [复制]

    这个问题在这里已经有答案了 可能的重复 JQuery radioButton change 在取消选择期间不会触发 https stackoverflow com questions 5176803 jquery radiobutton c
  • 导致回发到与弹出窗口不同的页面

    我有一个主页和一个详细信息页面 详细信息页面是从主页调用的 JavaScript 弹出窗口 当单击详细信息页面上的 保存 按钮时 我希望主页 刷新 是否有一种方法可以调用主页的回发 同时还可以从详细信息页面维护保存回发 Edit 使用win

随机推荐

  • fifo读写写测试

    记录学习日常 本实验参考正点原子的实验教程 按照自己的理解来完成实验 四个模块 第一个模块是调用fifo IP核并设计类型 二 写如数据模块 三 读数据模块 四 顶层模块 ip核设置如图 二 写数据模块的输入有时钟 复位 写满 写空 输出有
  • 实战:彻底搞定 SpringBoot 整合 Kafka

    前言 kafka是一个消息队列产品 基于Topic partitions的设计 能达到非常高的消息发送处理性能 Spring创建了一个项目Spring kafka 封装了Apache 的Kafka client 用于在Spring项目里快速
  • Java初识 (数据类型)

    有人说Java是一种简单的语言 实际上没有简单的语言 只有相对简单 Java是一种面向对象的语言 学习Java 首先得了解 JDK JDK Java开发者工具 JRM Java运行环境 JVM Java虚拟机 面试题 main 函数的参数是
  • 编写shell脚本——一键启动Hadoop集群

    第一步 1 创建一个存放脚本的目录 命令 mkdir bin 注 如果不了解存放脚本目录的命名 就将目录名命名为 bin 如果 自己命名为其他可能在后面第四步的时候查找不到脚本 2 在bin目录下创建 hadoop sh 脚本 1 进入新创
  • gp基础篇-用户与资源队列管理

    author skate time 2012 11 16 gp基础篇 用户与资源队列管理 gp像oracle一样 有自己的独立的用户管理模块 但gp不像oracle那样 把用户和用户组分的那么细 gp中的用户 即是用户 又是用户组gp中的用
  • 目标检测研究现状调研

    近期在调研目标检测的研究现状 包括two stage和one stage 以及anchor based和anchor free 把用到的一些链接记录一下 方便查阅 机器之心的一篇文章 从锚点到关键点 最新的目标检测方法发展到哪了 这篇文章介
  • linux jmap命令详解,jmap命令 linux jmap如何使用

    1 linux jmap如何使用 jmap命令可以获得运行中的jvm的堆的快照 从而可以离线分析堆 以检查内存泄漏 检查一些严重影响性能的大对象的创建 检查系统中什么对象最多 各种对象所占内存的大小 命令格式 jmap options pi
  • Linux和Windows火狐浏览器书签无法同步

    前言 装了ubuntu后发现Windows下的firefox书签无法同步 而且都登陆了相同的Google账号 最终发现问题所在 firefox有个全球服务和本地服务 ubuntu下的firefox默认是全球服务的 而windows下的fir
  • 利用do while 循环和 switch 分支语句做一个简易的ATM机

    自己的写的过程体会 第一步 重要的 要检查你的电脑是否联网了 本人在写到第3步时没注意到电脑没联网 就一直在显示不了你想要的结果 本来信誓旦旦说没错啊 就是这样啊 可是就显示不了 后来才发现是网络问题 所以 网络很重要 一把泪 啊 然后呢
  • python收集数据做主神_里纲_[综漫]收集数据做主神小说无防盗章节_作者忘却的悠_新书包网(www.51aslz.com)...

    里包恩怎么了 没什么 只是在想 你做为里包恩的学生 能不能帮我个忙 帮忙 纲不好意思的抓了抓头发 所有的心思都写在了脸上 什么我这么废柴能帮什么忙 虽然我很想帮忙 但是我真的什么都做不好 找里包恩本人更快吧 实在不行还有山本和狱寺他们 不过
  • RequestMapping中produces属性作用

    注解RequestMapping中produces属性可以设置返回数据的类型以及编码 可以是json或者xml RequestMapping value xxx produces application json charset UTF 8
  • mysql如何将表导出到excel

    一 显示当前使用或者指定的database中的每个表的信息 信息包括表类型和表的最新更新时间 show table status 二 mysql如何将表结构导出到excel SELECT TABLE NAME 表名 COLUMN NAME
  • 计算机视觉与深度学习-图像分割-视觉识别任务03-实例分割-【北邮鲁鹏】

    目录 参考 定义 Mark R CNN 结构 思路 Mask R CNN训练阶段使用的Mask样例 Mask R CNN实例分割结果 Mask R CNN检测姿态 参考 论文题目 Mask R CNN 论文链接 论文下载 论文代码 Face
  • 四、在原理图中添加每个元件的封装

    画完每个元件的封装后 回到原理图界面 双击每个原理图元件 在编辑中添加封装 全部添加好右键点击原理图 选择validate pcb 那个 编译原理图文件 会自动检查错误 检查出来可以导出一个错误文档 然后根据文档修正即可 这个编译是将元件的
  • android点击后图片变大,Android实现点击缩略图放大效果

    import android animation Animator import android animation AnimatorListenerAdapter import android animation AnimatorSet
  • 【javascript】获取键盘输入

    获取上下左右键 在JavaScript中 如果我们想要获取键盘中的键对应的键码 可以使用event对象的keyCode属性
  • java连接kafka api_Kafka-JavaAPI(Producer And Consumer)

    Kafka JAVA API Producer和Consumer Kafka 版本2 11 0 9 0 0 producer package com yzy spark kafka import kafka javaapi producer
  • 2008年北大信科研究生复试 机考真题(一)--大数据十进制转换

    描述 将一个长度最多为30位数字的十进制非负整数转换为二进制数输出 输入 多组数据 每行为一个长度不超过30位的十进制非负整数 注意是10进制数字的个数可能有30个 而非30bits的整数 输出 每行输出对应的二进制数 样例输入 0 1 3
  • LogBack的使用

    需要JAR包 1 slf4j api 1 6 1 jar 2 logback access 0 9 29 jar 3 logback classic 0 9 29 jar 4 logback core 0 9 29 jar 加载顺序 1 l
  • Promise详解

    1 基本概念 Promise是JS异步编程中的重要概念 异步抽象处理对象 是目前比较流行Javascript异步编程解决方案之一 2 Promise的三种状态 pending 对象初始化状态 fulfilled 当调用resolve 成功