promise第一篇-简介
1. 创建一个promise对象
var promise = new Promise(function(resolve, reject){
//异步处理
//处理结束后调用resolve或reject
});
2. 设置promise对象在resolve或reject后的回调函数,可以使用promise.then()方法:
promise.then(onFulfilled, onRejected);
onFulfilled和onRejected都是函数,这两个参数均为可选参数。resolve(成功)时,onFulfilled会被调用;reject(失败)时,onRejected会被调用。如果只想对成功的情况进行处理可以采用:
promise.then(onFulfilled);
如果只想对失败的情况进行处理,可以采用:
promise.then(undefined, onRejected);
这种方式只指定reject(失败)时的回调函数,不过这种情况下用catch是一种更好的选择:
promise.catch(onRejected);
3. Promise静态方法(类方法)
Promise是一个构造函数,同时也是一个全局对象,Promise全局对象还拥有一些静态方法,或者说类方法(只能通过Promise调用,而不能通过Promise实例调用),比如Promise.all(),Promise.resolve()等。
4. Promise事例
function asyncFunction(){
return new Promise(function(resolve, reject){
setTimeout(function(){
resolve("Async Hello World.")
}, 1600);
});
} asyncFunction().then(function(res){
console.log(res);
}).catch(function(error){
console.log(error);
});
执行asyncFunction()函数会返回一个promise对象,该promise对象会在setTimeout之后的1600ms后被resolve。我们可以将promise理解成一个期望,如果该期望调用了resolve()方法,这个期望就被实现了,愿望实现后则会触发该promise对象的then中的onFulfilled函数;同样的,如果该期望调用了reject()方法,这个期望就破灭了,期望破灭后则会触发该promsie对象的then中的onReject函数,或者catch中的onReject函数。
上面用了catch方法,当然也可以不实用catch,只使用then:
function asyncFunction(){
return new Promise(function(resolve, reject){
setTimeout(function(){
resolve("Async Hello World.")
}, 1600);
});
} asyncFunction().then(function(res){
console.log(res);
}, function(error){
console.log(error);
});
5. Promise的状态
用new Promise实例化的promise对象具有三种状态:Fulfilled,Rejected和Pending。promise对象的状态,从Pending跳转到Fulfilled或者Rejected后,这个promise对象的状态就不会再发生任何变化,也就是说在then中注册的回调函数可以肯定的说只会被调用一次。Fulfilled或者Rejected这两个中的任一状态都可以表示为Settled(不变的)。可见promise的状态跳转是非常简单易懂的。
6. 理解catch
事实上,catch(onRejected)只是then(undefined, onRejected)的别名而已。一般来说使用catch将resolve和reject分开是比较推荐的做法。关于用then和catch的区别,看一下下面的代码:
function throwError(value) {
// 抛出异常
throw new Error(value);
}
// <1> onRejected不会被调用
function badMain(onRejected) {
return Promise.resolve(42).then(throwError, onRejected);
}
// <2> 有异常发生时onRejected会被调用
function goodMain(onRejected) {
return Promise.resolve(42).then(throwError).catch(onRejected);
}
// 运行示例
badMain(function(error){
console.log('bad' + error);
});
goodMain(function(error){
console.log('good' + error);
});
在上面的代码中badMain是一种不太好的实现方式,goodMain则是一种非常好的进行错误处理的版本。事实上,then和catch都会创建并返回一个新的promise对象。promise在方法链中增加一次处理的时候所操作的都是完全不同的promise对象。当然,犹豫catch是then的别名,我们使用then也可以完成同样的工作,只不过用catch意图更明确:
Promise.resolve(42).then(throwError).then(undefined, onRejected);
promise第一篇-简介的更多相关文章
- Python第一篇-简介和入门
简介: Python[1] (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明,第 ...
- spark第一篇--简介,应用场景和基本原理
摘要: spark的优势:(1)图计算,迭代计算(2)交互式查询计算 spark特点:(1)分布式并行计算框架(2)内存计算,不仅数据加载到内存,中间结果也存储内存 为了满足挖掘分析与交互式实时查询的 ...
- hive第一篇----简介和使用客户端
摘要by crazyhacking:•Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能.•本质是将SQL转换为MapReduce程序的映射 ...
- highcharts第一篇---简介和使用
Highcharts 是一个用纯JavaScript编写的一个图表库, 能够很简单便捷的在web网站或是web应用程序添加有交互性的图表,并且免费提供给个人学习.个人网站和非商业用途使用.HighCh ...
- 分布式文件系统 FastDFS 5.0.5 & Linux CentOS 7 安装配置(单点安装)——第一篇
分布式文件系统 FastDFS 5.0.5 & Linux CentOS 7 安装配置(单点安装)--第一篇 简介 首先简单了解一下基础概念,FastDFS是一个开源的轻量级分布式文件系统,由 ...
- SAP-ABAP系列 第一篇SAP简介
第一篇 SAP简介 SAP全名为System Application and Products in Data Processing.SAP目前是全世界排名第一的RP软件,号称“全球最大的企业管理解决 ...
- 【ABAP系列】SAP ABAP7.40新语法简介第一篇
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP7.40新语法简 ...
- 第一篇 Replication:复制简介
本篇文章是SQL Server Replication系列的第一篇,详细内容请参考原文. 复制这个词来自拉丁语中的"replicare",意味着重复.Replication des ...
- 【译】第一篇 Replication:复制简介
本篇文章是SQL Server Replication系列的第一篇,详细内容请参考原文. 复制这个词来自拉丁语中的"replicare",意味着重复.Replication des ...
随机推荐
- Pairproject 移山之道 阅读随笔和一些问题
首先不得不承认这本书的写作方式很独特,不像其他的计算机类的图书那样枯燥,让人读起来感觉很有意思,他也颠覆了我对计算机类图书的看法,这种写作方式值得我们学习. 先谈谈收获吧.读了两年大学,这是第一次写类 ...
- Junit4使用实验报告
一.题目简介 Junit4的使用及求和测试. 二.源码的github链接 https://github.com/bjing123/test-/blob/master/Arithmetic.txt ht ...
- I/O(输入/输出)
1.创建引用ObjectInputStream ois =null; ObjectOutputStream oos = null; ByteArrayInputStream bais = null; ...
- JEECG--去掉(增加)登陆页面验证码功能 - CSDN博客
JEECG--去掉(增加)登陆页面验证码功能 - CSDN博客https://blog.csdn.net/KooKing_L/article/details/79711379
- TortoiseSvn/Git的WaterEffect
https://github.com/TortoiseGit/TortoiseGit/blob/master/src/Utils/MiscUI/WaterEffect.cpp C#的实现: http: ...
- Notepad++ 大小写转换
code_field_text 普通文本 code_field_user_id 用户ID code_field_customer_id 客户ID code_field_dict 数据字典 code_f ...
- Java并发—synchronized关键字
synchronized关键字的作用是线程同步,而线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. synchronized用法 1. 在需要同步的方法的方法签名中加入synchro ...
- RBAC权限控制系统
1.概述 RBAC(Role-Based Access Control )基于角色的访问控制. RBAC的权限控制可以抽象概括为:判断[Who是否可以对What进行How的访问操作(Operator) ...
- 金蝶特性配置(超级BOM)
特性配置 特性物料 物料和特性的对应关系 自动新增物料的系统设置 特性物料自动新增 自动新增的特性配置方案 相关表 ICPlan_CharacteristicEntry
- HMM模型学习笔记(维特比算法)
维特比算法(Viterbi) 维特比算法 编辑 维特比算法是一种动态规划算法用于寻找最有可能产生观测事件序列的-维特比路径-隐含状态序列,特别是在马尔可夫信息源上下文和隐马尔可夫模型中.术语“维特比 ...