ECMAScript6 Promise
Promise在Javascript中早就已经实现,在ECMAScript6中正式加入到标准。那么Promise到底是干什么的?怎么用?
一、Promise介绍
Promise是一个对象,用来传递异步操作的消息,它有三种状态,pending(进行中)、resolved(成功)、rejected(失败)。
二、Promise基本用法
var promise = new Promise(function(resolve,reject){
if(/*成功*/) resolve(value);else reject(error)
})promise.then(function(value){
console.log(value)
},function(error){
console.log(error);
})
上面代码中,在初始化Promise时,Promise构造函数接收一个函数作为参数。这个函数又有两个参数resolve和reject,从红色代码部分可以看出这个歌参数也是函数,但是不同于其他参数,resolve和reject这两个函数是内置的,由javascript引擎提供。resolve的作用是将状态从pending改变为resolved,reject是将状态改为rejected。
再看then方法,这个方法接收两个函数作为参数,在上面的代码中分别是绿色部分和黄色部分。第一个函数也就是绿色部分是指定将状态改变为resolved时的回调函数,也就是说在上述代码中如果resolve(value)这个句执行,就会触发绿色部分的回调。执行reject则会触发黄色部分函数的回调。
三、异常捕获
Promise中是如何捕获异常的呢?看下面的代码。
var promise = new Promise(function(resolve,reject){
throw new Error('error');
})
promise.then(function(value){
console.log(value)
},function(error){
console.log(error+' reject');
}).catch(function(error){
console.log(error+' catch');
})
上述代码执行出得效果是error reject,为什么不是error catch呢?其实这样的,reject的回调函数不仅能作为将promise状态改变为rejected,而且还能处理上一步抛出异常时的情况。那么既然这样catch也有什么存在的意义呢?首先reject的回调不一定都会定义,其次catch可以捕获整个流程中所有环节抛出的异常,而reject只能处理上一步发生的异常。把上面代码改造一下,看得会更清楚。
var promise = new Promise(function(resolve,reject){
throw new Error('error');
})
promise.then(function(value){
console.log(value)
},function(error){
console.log(error+' reject');
throw new Error('error1');
})
.then(function(value){
console.log(value);
})
.catch(function(error){
console.log(error+' catch');
})
执行上述代码,可以看出红色部分的异常被catch部分捕获到了,是因为黄色部分的没有定义reject的回调,所以红色部分的异常一直冒泡到最后。
四、Promise.all()
Promise.all()是将多个promise实例,包装成一个新的promise实例。
var promiseAll = function(name){
return new Promise(function(resolve,reject){
resolve('my name is '+name);
})
}var promise1 = promiseAll('111'),
promise2 = promiseAll('222'),
promise3 = promiseAll('333');
var p = Promise.all([promise1,promise2,promise3]);
p.then(function(data){
console.log(data)
}).catch(function(e){
console.log(e)
})
上面代码中promiseAll是一个返回一个Promise对象的函数,Promise1,promise2,promise3都是通过promiseAll得到一个Promise对象。p是通过Promise.all()方法生成的一个新的实例。最后的结果是["my name is 111", "my name is 222", "my name is 333"],也就将所有包装的Promise对象返回的结果包装成一个数组。值得注意的是Promise.all()这个方法传入的参数也是一个数组,否则会报错。另外p所包装的Promise对象中只要有一个失败,p的状态就是失败。
五、Promise.race()
Promise.race()同样是将多个Promise对象包装成一个新的Promise对象
var p = Promise.race([promise1,promise2,promise3]);
新的Promise对象p的装态是根据所包装的对象promise1,promise2,promise3中状态最先改变的Promise对象确定的,那个率先改变的Promise对象的值就传给p的回调函数。
上面是简单介绍了promise,那个意义主要是解决回调的多层嵌套,是代码更加的清晰。
更多promise内容请移步http://es6.ruanyifeng.com/#docs/promise
ECMAScript6 Promise的更多相关文章
- ECMAScript6的Promise对象
1. 概念 Promise对象用于异步(asynchronouss)计算,一个Promise对象代表着一个还未完成,但预期完成的操作. 2. 出现原因: 1) 如果你需要通过ajax发送多次请求,而 ...
- ECMAScript6——异步操作之Promise
Promise对象的参数为一个回调函数,这个回调函数有两个参数,分别是resolve, reject(这俩参数的名字可任取),resolve,reject分别表示异步操作执行成功后的回调函数和异步操作 ...
- 浅尝ECMAScript6
浅尝ECMAScript6 简介 ECMAScript6 是最新的ECMAScript标准,于2015年6月正式推出(所以也称为ECMAScript 2015),相比于2009年推出的es5, es6 ...
- JavaScript中 Promise的学习以及使用
今天一个哥们发过来一段js代码,没看懂,就顺便学习了一下,代码如下 Promise.resolve('zhangkai').then(value => {console.log(value)} ...
- 简单理解ECMAScript2015中的Promise
ECMAScript6中新增了Promise对象, 所谓Promise对象,即代表着一个还未完成,但将来某时会完成的操作(通常是异步操作).使用Promise对象,我们就可以避免陷入函数层层嵌套的‘回 ...
- 关于promise对象的笔记
1.promise对象是ECMAScript6的新特性,很多新的JS框架都有它的实现和应用 2.promise常用于异步调用(ajax)中 3.promise主要用于解决回调函数层层嵌套的写法 4.要 ...
- ECMAScript6标准新增加的内容
首选呐,你得了解一下javascript和ECMAScript的关系: 编程语言JavaScript是ECMAScript的实现和扩展,由ECMA(一个类似W3C的标准组织)参与进行标准化.ECMAS ...
- promise异步编程的原理
一.起源 JavaScript中的异步由来已久,不论是定时函数,事件处理函数还是ajax异步加载都是异步编程的一种形式,我们现在以nodejs中异步读取文件为例来编写一个传统意义的异步函数: var ...
- Promise小书(长文)
promise基础 Promise是异步编程的一种解决方案.ES6 Promise的规范来源于Promises/A+社区,它有很多版本的实现. Promise比传统的解决方案(回调函数和事件)更合理和 ...
随机推荐
- 【C/C++】知识点系统复习 (第一周)
2018/12/18 周二 1. C++内存布局分为几个区域,每个区域有什么特点? 主要可以分为 5 个区域, (1) 栈区:由编译器自动分配释放,存放函数的参数值,局部变量的值等.其操作方式类似于数 ...
- 观察者模式Observer
原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11409319.html 1. 定义定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依 ...
- websocket 中使用Service层的方法
创建公共Utils 类 ApplicationContextRegister @Component @Lazy(false) public class ApplicationContextRegist ...
- PHP disk_free_space() 函数
定义和用法 disk_free_space() 函数返回指定目录的可用空间,以字节为单位. 语法 disk_free_space(directory) 参数 描述 directory 必需.规定要检查 ...
- redis-持久化、主从复制、集群
持久化 RDB.AOF(redis.conf) 主从复制 redis.conf 集群 redis-trib.rb.ruby相见如下链接http://www.cnblogs.com/wuxl360/p/ ...
- redis配置文件详解-3
redis3.0以上配置文件 #################################INCLUDES ################################### include ...
- python进阶:类和对象
@修饰符:将被修饰的函数作为参数,运行修饰函数 实例方法: 静态方法:@staticmethod 类方法:@classmethod 自省:通过一定的机制查询到对象的内部结构 序列类: 列表推导式(例表 ...
- MySQL strcmp 函数
STRCMP(str1, str2) 比较两个字符串,如果这两个字符串相等返回0,如果第一个参数是根据当前的排序小于第二个参数顺序返回-1,否则返回1. mysql> SELECT STRCMP ...
- IOS 基于APNS消息推(JAVA后台)
直接上Demo import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.StringUti ...
- VMware里克隆出来的CentOS Linux device eth0 does not seem to be present, delaying initialization
解决办法:1.ifconfig eth1 确定新网卡的MAC地址.nmcli con 确定新网卡的UUIDvim /etc/udev/rules.d/70-persistent-net.rules把原 ...