基础知识:Promise(整理)

基础知识:Promise(整理)

(来自牛客网)下面关于promise的说法中,错误的是(D)
A. resolve和reject都是直接生成一个进入相应状态的promise对象,其参数就是进入相应状态时传递过去的参数,可以在完成回调的参数中得到
B. Promise.resolve(value),Promise.reject(reason)是Promise构造器上还直接提供了一组静态方法
C. 在调用then方法或者catch方法时都是异步进行的,但是执行速度比较快
D. Promise构造器的prototype上还有两个方法,分别是then和catch。这两个方法的参数也是回调函数,这些函数会在Promise实例进入不同状态后被调用。Then对应到resolve,catch对应到reject。(个人理解是“then对应resolve”这里不对,then可以接受两个回调函数作为参数。第一个回调函数是Promise对象的状态变为Resolved时调用,第二个回调函数是Promise对象的状态变为Rejected时调用。其中,第二个函数是可选的)


1.概念

Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,就是一个对象,用来传递异步操作的消息。它代表了某个未来才会知道结果的事件(通常是一个异步操作),并且这个事件提供统一的 API,可供进一步处理。

Promise 对象有以下两个特点。

(1)对象的状态不受外界影响。Promise 对象代表一个异步操作,有三种状态:Pending(初始状态)、Resolved(已完成,又称 Fulfilled)和 Rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是 Promise 这个名字的由来,它的英语意思就是「承诺」,表示其他手段无法改变。

(2)一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise 对象的状态改变,只有两种可能:从 Pending 变为Resolved和从Pending变为 Rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果。就算改变已经发生了,你再对 Promise 对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。

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

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

2.基本用法

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

 1 //创建了一个Promise实例
 2 var promise = new Promise(function(resolve, reject) {
 3   // ... some code
 4
 5   if (/* 异步操作成功 */){
 6     resolve(value);
 7   } else {
 8     reject(error);
 9   }
10 });

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

resolve函数的作用是,将Promise对象的状态从“未完成”变为“成功”(即从Pending变为Resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;reject函数的作用是,将Promise对象的状态从“未完成”变为“失败”(即从Pending变为Rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。

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

1 promise.then(function(value) {
2   // success
3 }, function(error) {
4   // failure
5 });

then方法可以接受两个回调函数作为参数。第一个回调函数是Promise对象的状态变为Resolved时调用,第二个回调函数是Promise对象的状态变为Rejected时调用。其中,第二个函数是可选的,不一定要提供。这两个函数都接受Promise对象传出的值作为参数。

Promise.prototype.then() Promise实例具有then方法,也就是说,then方法是定义在原型对象Promise.prototype上的。它的作用是为Promise实例添加状态改变时的回调函数。前面说过,then方法的第一个参数是Resolved状态的回调函数,第二个参数(可选)是Rejected状态的回调函数。

then方法返回的是一个新的Promise实例(注意,不是原来那个Promise实例)。

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

但使用这个这个方法的时候要注意一下几点:
(1)当promise状态已经变成Resolved的时候,再抛出错误时是无效的。看下面的代码。

var promise=new promise(function(resolve,reject){
   resolve("ok");
   throw new Error("test");
});
promise.then(function(value){consloe.log(val); })
            .catch(function(error){console.log(err)});

promise状态在resolve("ok");之后就会把promise的状态变为Resolved,之后抛出错误也不会把promise状态变为rejected,所以catch方法并不会捕获到错误。

(2)尽量将catch方法写在链式操作的最后,当错误会一直冒泡到最后,catch放在最后会捕捉到所有错误。当catch设置的过早,并且之后在没有catch方法的话,那么这个catch之后发生的错误不会被捕获到。

(3)当没有使用catch方法指定错误处理函数的回调函数时,promise对象里面抛出的错误不会传递到外层的代码。

一般来说,不要在then方法里面定义Reject状态的回调函数(即then的第二个参数),总是使用catch方法。

Promise.resolve() 这个方法的作用就是将现有的对象转化为Promise对象,进而可以执行这些方法。

时间: 2025-01-02 06:05:47

基础知识:Promise(整理)的相关文章

SQL基础知识回顾整理

20150929~20151016所学SQL基础知识回顾整理,后续完善补充 服务器名称:是指你要连接的安装的数据库服务器所在的那台电脑的ip地址,如果是本机的话,就是  . mdf 结尾:数据库数据文件,一个数据库有且只有一个 ldf:数据库日志文件,一个数据库有且至少有一个 数据库中存放数据的结构,是通过表的形式来存储的,一个数据库中有很多个表 基础知识(创建.使用数据库及创建表.添加数据.删除表) 约束 查询 子查询 表连接 视图 各类函数 存储过程 触发器 分页语句 事务 20150929

C#基础知识回顾整理

20150907~20150928所学基础知识整理,后续完善补充 数据类型 变量 运算符 语句:条件语句.循环语句.跳转语句.异常语句 时间 类.类型 数组.冒泡排序 数组.迷宫操作 集合 结构体 枚举.函数 递归 数据类型: 变量:用于临时存储数据的 变量的定义: 数据类型 变量名: 数据类型  变量名=赋值: 数据类型  变量名1,变量名2,变量名3...: //生成随机数的类 Random r = new Random(); int shu = r.Next(100); Console.W

虚拟化基础知识体系整理

梳理出虚拟化有关的基本知识框架,逐步丰富框架,并针对结点深入学习总结. 模拟器原理 了解模拟器的原理,有助于理解虚拟化底层原理,所以需要适当的补充下基础知识. --QEMU,Bochs -- 解释执行 -- 二进制动态翻译 -- dyngen -- TCG(Tiny  Code Generator) 虚拟化 -- CPU虚拟化 -- 指令模拟 -- 解释执行 -- 扫描与修补 -- 二进制代码翻译 -- 中断和异常 -- 多称多处理器的模拟 -- intel 硬件辅助cpu虚拟化 -- 内存虚拟

HTML基础知识回顾整理

20151008~20151101所学HTML内容回顾整理 HTML (标签.div+Css)+ JS(js语法,dom,jquery) HTML: Hyper Text Mankup Language 超文本标记语言 学html,实际就是在学标签都有哪些,怎么用.如何通过标签来控制文本样式. 文件后缀:html, htm 一.标签:基本标签.文字标签.内容标签.布局标签 二.用ps把一张图做成HTML页面 三.div+Css 四.杂 基本标签: <html> <head> <

JS基础知识再整理..........不断更新中

1.JS的五种基本数据类型:字符串.数值.布尔.null.underfined. 2.在JS中,字符串.数值.布尔三种数据类型,有其属性和方法: 3.字符串的三种常用方法[.indexof()..substring()..split()]和一种常用属性[.length]; 例子如下: /*提取字符串中列表的每一项*/ var aa="This is a list:red,blue,white,black."; var start=aa.indexOf(":"); /

[设计模式整理笔记 一] 基础知识

[设计模式整理笔记 一] 基础知识 [导读] [设计模式整理笔记 一] 基础知识 [设计模式整理笔记 二] 简单工厂模式(Simple Factory) [设计模式整理笔记 三] 工厂模式(Factory) [设计模式整理笔记 四] 抽象工厂模式(Abstract Factory) [设计模式整理笔记 五] 创建者模式(Builder) [设计模式整理笔记 六] 工厂模式与创建者模式总结 [设计模式整理笔记 七] 原型模式(ProtoType) [设计模式整理笔记 八] 单例模式(Singlet

[terry笔记]data guard基础知识

如下介绍了data guard的基础知识,整理自网络: Data Gurad 通过冗余数据来提供数据保护,Data Gurad 通过日志同步机制保证冗余数据和主数据之前的同步,这种同步可以是实时,延时,同步,异步多种形式.Data Gurad 常用于异地容灾和小企业的高可用性方案,虽然可以在Standby 机器上执行只读查询,从而分散Primary 苏菊哭的性能压力,但是Data Gurad 决不是性能解决方案. 在Data Gurad 环境中,至少有两个数据库,一个处于Open 状态对外提供服

整理JavaScript高级基础知识

整理JavaScript高级基础知识 因为空余时间很多..所以博客更新频率得相对频繁些.. 原型以及原型链 考察原型以及原型链: var object = {} object.__proto__ === Object.prototype // 为 true var fn = function(){} fn.__proto__ === Function.prototype // 为 true fn.__proto__.__proto__ === Object.prototype // 为 true

Java基础知识整理(一)

概述 公司业务需要,产品既要有.NET又需要Java,没得选择,只能业余时间学习Java,整体觉得Java也.NET还是很相似的,只是语法有差别,差别也不是很大,这就将学习Java的基础知识整理下,以便于自己的学习.作为个.NET程序猿也可以学习Java ,毕竟技多不压身,学习多也要精通. 开发工具 eclipse ,开发java类似.NET 需要装JDK类似.NET Framework. Java开发工具eclipse设置 1.设置字体:window设置: 2.设置快捷键:window--ke