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比传统的解决方案(回调函数和事件)更合理和 ...
随机推荐
- 人脸识别课件需要安装的python模块
Python3.6安装face_recognition人脸识别库 https://www.jianshu.com/p/8296f2aac1aa
- Bootstrap 网页1
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- 简单的51单片机多任务操作系统(C51)
在网上看到这段代码,所以自己尝试了,可以跑起来,但是没有精确的定时功能,仅仅是任务的调度而已. 数组中是11,而不是12.这里写错了... /* 简单的多任务操作系统 其实只有个任务调度切换,把说它是 ...
- 基于CentOS 7.3 安装Ceph Jewel 10.2.9
https://www.lijiawang.org/posts/intsall-ceph.html 配置说明: 采用了4台centos7.3系统的虚拟机,1台Ceph-Master作为安装节点,NTP ...
- AcWing 230. 排列计数 水题(组合数+错排)打卡
题目:https://www.acwing.com/problem/content/232/ #include<bits/stdc++.h> #define ll long long #d ...
- iOS 技能图谱
# iOS 技能图谱## 编程语言 - Swift - Objective-C - C++/C - JavaScript ## 操作系统 - Mac OSX - iOS - watchOS - tvO ...
- embed元素 autostart false 失效时的解决方法
embed元素 autostart false 失效时的解决方法 最近在工作中碰到了在网页中嵌入播放器播放声音文件的需求,最后使用了embed元素 代码如下: <embed src='1093. ...
- SSH的两种登录方式
ssh客户端使用的是Xshell,windows环境. 第一种方式,用户名密码方式 原理如下: 客户端发起ssh请求之后,服务器把自己的公钥传给客户端 客户端输入服务器密码通过公钥加密之后传给服务器 ...
- SPSS输出的结果都要写到文章中吗
SPSS输出的结果都要写到文章中吗 经常有人问到,SPSS输出的结果都要写到文章中吗?文章中应该写什么呢?比如,均值.中位数.众数.标准差.百分位数.最小值.最大值等等,都要出现在文章中吗?洋洋洒洒那 ...
- linux命令行光标移动技巧
看一个真正的专家操作命令行绝对是一种很好的体验-光标在单词之间来回穿梭,命令行不同的滚动.在这里强烈建立适应GUI节目的开发者尝试一下在提示符下面工作.但是事情也不是那么简单,还是需要知道“如何去做” ...