es6对于Promise 对象的详解(2024-04-11)

1、Promise 含义

Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。

从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。

2、Promise对象的特点

(1)对象的状态不受外界影响。

Promise对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。

只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。

(2)一旦状态改变,就不会再变,任何时候都可以得到这个结果。

Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)。

如果改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。

有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise对象提供统一的接口,使得控制异步操作更加容易

缺点:

首先,无法取消Promise,一旦新建它就会立即执行,无法中途取消。其次,如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。第三,当处于pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)

3、Promise的基本用法

ES6 规定,Promise对象是一个构造函数,用来生成Promise实例。

const promise = new Promise(function(resolve, reject) {// ... some codeif (/* 异步操作成功 */){resolve('success);} else {reject(error);}
});

Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolvereject。它们是两个函数,由 JavaScript 引擎提供,不用自己部署。

resolve函数:将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;

reject函数:将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。

Promise实例生成以后,可以用then方法分别指定resolved状态和rejected状态的回调函数。

let promise = new Promise(function(resolve, reject) {console.log('Promise');resolve();
});promise.then(function() {console.log('resolved.');
});console.log('Hi!');// Promise
// Hi!
// resolved

Promise 新建后立即执行,所以首先输出的是Promise

然后,then方法指定的回调函数,将在当前脚本所有同步任务执行完才会执行,所以resolved最后输出.

4、Promise.prototype.then() 实例对象

Promise 实例具有then方法,也就是说,then方法是定义在原型对象Promise.prototype上的。它的作用是为 Promise 实例添加状态改变时的回调函数。

前面说过,then方法的第一个参数是resolved状态的回调函数,第二个参数是rejected状态的回调函数,它们都是可选的。

then方法返回的是一个新的Promise实例(注意,不是原来那个Promise实例)。因此可以采用链式写法,即then方法后面再调用另一个then方法。

getJSON("/posts.json").then(function(json) {// ... 第一个实例return json.post;
}).then(function(post) {// ... 第二个实例
});

5、Promise.prototype.catch() 实例对象

Promise.prototype.catch()方法是.then(null, rejection).then(undefined, rejection)的别名,用于指定发生错误时的回调函数,接受错误信息使用。

getData('/posts').then(function(posts) {// ...
}).catch(function(error) {// 处理 getData 和 前一个回调函数运行时发生的错误console.log('发生错误!', error);
});

getData()方法返回一个 Promise 对象,如果该对象状态变为resolved,则会调用then()方法指定的回调函数;

如果异步操作抛出错误,状态就会变为rejected,就会调用catch()方法指定的回调函数,处理这个错误。

另外,then()方法指定的回调函数,如果运行中抛出错误,也会被catch()方法捕获。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/808664.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文章分享:ctDNA高通量测序临床实践专家共识(2022年版)

【摘要】 循环肿瘤DNA(circulating tumor DNA,ctDNA)高通量测序在肿瘤临床诊疗中发挥越来越重要的作用,但其临床检测标准和应用范围尚缺乏统一认识。中国抗癌协会肿瘤标志专业委员会组织相关专家,结合国内临床实践&…

蓝桥杯-【二分】分巧克力,跳石头

代码及解析: #include<bits/stdc.h> using namespace std; int n,k; const int N100010; int h[N],w[N]; bool check(int d){int num0;for(int i0;i<n;i) num (h[i]/d)*(w[i]/d);if(num>k) return true; //够分else return false; //不够分 } in…

Golang教程一(环境搭建,变量,数据类型,数组切片map)

目录 一、环境搭建 1.windows安装 2.linux安装 3.开发工具 二、变量定义与输入输出 1.变量定义 2.全局变量与局部变量 3.定义多个变量 4.常量定义 5.命名规范 6.输出 7.输入 三、基本数据类型 1.整数型 2.浮点型 3.字符型 4.字符串类型 转义字符 多行字符…

深度学习简介

深度学习简介 一、引言&#xff1a;深度学习的兴起 简短介绍深度学习的历史背景 深度学习&#xff0c;作为人工智能领域的一颗冉冉升起的新星&#xff0c;其根源可以追溯到上世纪的感知机学习算法。这种算法模拟人类的神经元行为&#xff0c;是最早期的尝试之一。然而&#x…

OpenLayers6实战,OpenLayers实现鼠标拖拽方式绘制矩形(拖拽方式绘制长方形和正方形)

专栏目录: OpenLayers实战进阶专栏目录 前言 本章介绍使用OpenLayers在地图上实现鼠标拖拽方式绘制矩形(拖拽方式长方形和正方形)。 OpenLayers本身是可以通过鼠标点击多个点的方式来绘制多边形的,当然也包括长方形和正方形,但是这种多边形绘制出来的图形并不是准确的“…

Spring Boot中@Value注入静态变量

项目场景&#xff1a; Spring Boot中静态变量想使用Value注入值&#xff1a; 在application.properties或application.yml中定义topic名称&#xff1a; # application.properties test.name测试 Value("${test.name}") public static String name; 这时候打印发…

RocketMQ笔记(六)SpringBoot整合RocketMQ发送延迟消息

目录 一、简介1.1、延迟级别 二、Maven依赖三、application配置四、生产者4.1、同步发送延迟消息4.2、异步发送延迟消息 五、延迟级别修改5.1、 修改Broker端配置5.2、 通过Broker的运维命令修改5.3、 规则遵循 一、简介 在之前的文章中&#xff0c;我讲过了&#xff0c;同步发…

前端小白的学习之路(Vue2 四)

提示&#xff1a;学习vue2的第四天&#xff0c;笔记记录&#xff1a;混入(mixins),插槽(slot),过渡与动画(transition) 目录 一、混入(mixins) 二、插槽(solt) 1.匿名插槽 2.具名插槽 三、过渡与动画(transition) 1.过渡 1&#xff09;单元素过渡 Ⅰ.通用类名 Ⅱ.指定…

每天学点儿Python(6) -- 列表和枚举

列表是Python中内置的可变序列&#xff0c;类使用C/C中的数组&#xff0c;使用 [ ] 定义列表&#xff0c;列表中的元素与元素之间用英文逗号&#xff08; , &#xff09;分隔&#xff0c; 但是Python中列表可以存储任意类型的数据&#xff0c;且可以混存&#xff08;即类型可以…

图层、窗口、画布、视图

本文内容主要参考《Android图形显示系统》 图形显示系统会涉及到图层、窗口、画布和视图等概念&#xff0c;下面分别对它们进行简单介绍。 1&#xff09;图层&#xff1a;图层是SurfaceFlinger中的概念&#xff0c;使用Layer表示&#xff0c;SurfaceFlinger在合成最终显示的图…

项目管理-人情世故

综述&#xff1a;对于事业生活&#xff0c;人情世故我觉得在生活工作中比较重要&#xff0c;下面是我说的自己想法&#xff0c;有啥不对的&#xff0c;可以一起沟通确认。 事业上 总的来说&#xff0c;我们大多数为人情世故大家觉得没啥&#xff0c;实际上我觉得也挺重要的。…

Partisia Blockchain 何以落地隐私技术的高能场景应用?

致力于隐私保护、互操作性和可持续创新的 Layer1 区块链新星&#xff0c;Partisia Blockchain 以安全公平标榜&#xff0c;带给加密用户无忧交易的体验环境。对于这样一个融合零知识证明&#xff08;ZK&#xff09;技术和多方计算&#xff08;MPC&#xff09;的全新项目来说&am…

18_SPI通信外设

SPI通信外设 SPI通信外设SPI外设简介SPI框图SPI基本结构主模式全双工连续传输非连续传输 SPI通信外设 SPI外设简介 STM32内部集成了硬件SPI收发电路&#xff0c;可以由硬件自动执行时钟生成、数据收发等功能&#xff0c;减轻CPU的负担 可配置8位/16位数据帧、高位先行/低位先…

TypeScript尚硅谷学习

第二章&#xff1a;面向对象 面向对象是程序中一个非常重要的思想&#xff0c;它被很多同学理解成了一个比较难&#xff0c;比较深奥的问题&#xff0c;其实不然。面向对象很简单&#xff0c;简而言之就是程序之中所有的操作都需要通过对象来完成。 举例来说&#xff1a; 操作…

wsl 2在windows11上的设置

详细参考&#xff1a;Manual installation steps for older versions of WSL | Microsoft Learn 1.系统组件要打开 分别是&#xff1a;Hyper-V、虚拟机平台、适用于Windows的Linux子系统 2.以管理员方式运行命令行&#xff0c;逐步执行下面的命令 update to WSL 2, you must…

opc ua 环境构建(记录一)

1、准备 Siemens Simatic WinCC v7.5 二、配置 SIMATIC NET与S7-200 SMART 集成以太网口OPC 通信(TIA平台) 硬件: ①S7-200 SMART ②PC 机 ( 集成以太网卡) 软件: ① STEP 7-Micro/WIN SMART V2.1 ② STEP 7 Professional(TIA Portal V13 SP1 Upd 9) ③ SIMATIC NET …

在直播间卖云,云厂商终于“疯了”

图片&#xff5c;电影《疯狂的石头》截图 ©自象限原创 作者丨程心 云厂商们&#xff0c;在直播间打起来了&#xff01; 继阿里云在罗永浩直播间亮相、京东云硬刚友商之后&#xff0c;腾讯云也开始在“直播间”送起了福利。 4月8日&#xff0c;腾讯云发布新一代AIGC存…

设计基于锁的并发数据结构

1. 线程安全的栈容器 #include <exception> #include <memory> #include <mutex> #include <stack>struct empty_stack : std::exception {const char *what () const throw(); };template <typename T> class threadsafe_stack { private:std:…

记录vite打包并上传到npm

开始 起因&#xff1a;我们单位这个项目用的vitereact使用print打印 开发环境没问题、一到打包时就卡住、所以我就想单独打包成组件在引用看看还有问题么、结果还真可以&#xff01;又是离谱的一天 首先需要把npm的分支切换成官网地址、因为只有官网地址才能登陆npm账号 这里说…

FreeRTOS学习 -- 移植

一、添加FreeRTOS源码 在基础工程中新建一个名为FreeRTOS的文件夹&#xff0c;创建FreeRTOS文件夹以后将FreeRTOS的源码添加到这个文件夹中。 portable 文件夹&#xff0c;只需要保留keil、MemMang 和 RVDS这三个文件夹&#xff0c;其他的都可以删除掉。 移植FreeRTOSConfig…