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 ...
随机推荐
- Linux内核期末总结
20135316王剑桥<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC 1000029000 第一周 http://www.cn ...
- Linux实践四:ELF文件格式分析
一.分析ELF文件头 二.通过文件头找到section header table,理解内容 三.通过section header table 找到各section 四.理解常见.text .strta ...
- 20135323符运锦----LINUX第三次实践:程序破解
程序破解 一.掌握NOP.JNE.JE.JMP.CMP汇编指令的机器码 ①NOP:NOP指令即"空指令".执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行N ...
- springboot整合fastJson遇到重定向问题
通过网上教程使用springboot整合fastJson后遇到页面重定向问题(使用的springboot版本是2.0.2.RELEASE ,其他的版本可能不会出现以下问题),如下图: 我的项目结构如下 ...
- shell脚本--cut命令与awk简单使用
cut:对内容进行列切割 -d 后面的是分割符,表示用什么符号来分割符来分割列,分隔符使用引号括起来: -f后面跟着要选择的字段列,从1开始,表示第一列,如果要多列,可以用逗号分隔 : -c参数后面跟 ...
- Enum service under CentOS7
service --status all systemctl list-unit-files
- Jfrog Maven jenkins pipeline 流水线 培训 简单实验
1. 公司购买了一套jfrog artifactory ,然后厂商组织了一次培训 本次简单记录一下 jenkins和jfrog 二进制仓库的简单连接使用 2. 前期环境准备. scp jdk的tar包 ...
- Oracle数据库 查看表是否是 索引组织表的方法
1. 最近在工作过程中发现 一个表插入很慢 以为是索引组织表, 所以一直有点纠结 但是发现 产品里面是没有IOT的 于是找了下公司的OCP 问了下 如何查看 就是 user_tables 视图里面的一 ...
- prettier & codes format
prettier & codes format https://prettier.io/playground/ https://github.com/collections/front-end ...
- 重温Delphi之:面向对象
任何一门语言,只要具备了"封装,继承,多态"这三项基本能力,不管其实现方式是直接或曲折.复杂或简洁,就可以称之为“面向对象”的语言. Delphi当年的迅速走红,是以其RAD快速开 ...