Nodejs与ES6系列2:Promise对象
2、promise对象
js单线程异步执行的特性,因此在代码中充斥着回调函数。随着回调函数的增加,代码的可读性会愈来愈差,因此引入promise对象是不错的一种选择,可以避免层层回调函数。在ECMA6中提供了原生的promise对象而不再需要第三库。
2.1 promise构造
ECMA6中所提供的promise对象是由构造函数生成的,基本用法如下:
代码 2.1.1
new Promise(function (resolver, reject) {
if (success)
resolver(data)
else
reject(error)
});
在promise的构造函数中接受(一个带有两个参数的)函数做为入参,两个参数分别是resolver和reject,用于在异步回调中将状态改为成功,或将状态改为失败。代码2.1.2展示promise的简单示例:
var getData = function (data) {
return new Promise(function (resolver, reject) {
if (data === -1)
reject(data);
setTimeout(resolver([1, 2, 3, 4, 5]), 1);
})
}
getdata是一个返回promise对象的函数,通过setTimeout来模拟异步操作,当操作成功返回数组[],当输入参数为-1时返回失败状态。代码2.1.3调用getdata函数并返回结果,通过then方法得到成功后回调,而通过catch指定失败后的回调,除了通过catch方法指定失败回调外,还可以通过then方法的第二参数指定失败回调,两种方式等价。
getData(1).then(function (data) {
console.log(data);
}).catch(function (data) {
console.log('出现异常:'+data);
})
====
[ -1, 2, 3, 4, 5 ]
2.2、promise.all
很多业务场景需要对数据进行集合操作,例如发送数据取出一个集合数据,遍历集合数据将集合数据又发送至另一个接口取数据,这是一个典型的二次调用接口方法,此时就需要使用到promise.all 方法。
// return 集合
var getData = function (data) {
return new Promise(function (resolver, reject) {
if (data === -1)
reject(data);
setTimeout(resolver([-1, 2, 3, 4, 5]), 1);
})
}
var getdataInfo = function (data) {
return new Promise(function (resolver, reject) {
if (data === -1)
reject(data);
console.log(data + '的详情是...');
setTimeout(resolver(data), 1);
})
}
getData(1).then(function (data) {
var array = data.map(getdataInfo);
Promise.all(array).then(function (data) {
console.log('全部请求成功');
}).catch(function (data) {
console.log('数据' + data + '失败');
});
})
getdata函数返回一个集合,集合中的数据作为getdatainfo的函数的参数,而datainfo函数也是一个异步操作,首先通过数组map方法生成promise对象的数组,然后调用promise.all(array)调用promise数组,当整个promise都返回时触发promise.all的then方法,当其中一个失败的时候触发catch方法。
Nodejs与ES6系列2:Promise对象的更多相关文章
- Nodejs与ES6系列3:generator对象
3.generator对象 Generator函数是ES6提供的一种异步编程解决方案,语法行为与传统函数完全不同.Generator的中文翻译是生成器,它是ECMAScript6(代号harmory) ...
- es6中的promise对象
Promise是异步里面的一种解决方案,解决了回调嵌套的问题,es6将其进行了语言标准,同意了用法,提供了`promise`对象, promise对象有三种状态:pending(进行中) .Resol ...
- es6学习笔记--promise对象
Promise对象是为了简化异步编程.解决回调地狱情况 Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果.从语法上说,Promise 是一个对象,从它可 ...
- [js高手之路] es6系列教程 - promise常见用法详解(resolve,reject,catch,then,all,race)
关于promise我在之前的文章已经应用过好几次,如[js高手之路]Node.js+jade+express+mongodb+mongoose+promise实现todolist,本文就来讲解下pro ...
- ES6入门之Promise对象
1. Promise 的含义 Promise 是异步编程的一种解决方案,比传统的解决方案--回调函数和事件更合理.更强大. 1.1 什么是Promise 简单来说就是一个容器,里面保存着某个未来才会结 ...
- Nodejs与ES6系列4:ES6中的类
ES6中的类 4.1.class基本语法 在之前的javascript语法中是不存在class这样的概念,如果要通过构造函数生成一个新对象代码 function Shape(width,height) ...
- ES6系列_9之对象
1.对象赋值 es5中的对象赋值方式如下: let name="小明"; let skill= 'es6开发'; var obj= {name:name,skill:skill}; ...
- Nodejs与ES6系列1:变量声明
1.声明变量 在JS当中一个变量的作用域(scope)是程序中定义这个变量的区域.变量分为两类,全局(global)的和局部的.其中全局变量的作用域是全局性的,即在JavaScript代码中,它处处都 ...
- ES6的promise对象应该这样用
ES6修补了一位Js修真者诸多的遗憾. 曾几何时,我这个小白从js非阻塞特性的坑中爬出来,当我经历了一些回调丑陋的写法和优化的尝试之后,我深深觉得js对于多线程阻塞式的开发语言而言,可能有着其太明显的 ...
随机推荐
- CSS布局中的问题
1. 高度自适应的问题 1. 一个元素是否可以使用百分比显示,取决于它的父级元素,所以如果需要给此元素设置100%,那么需要先给父元素设置高100%. 2. 一级元素的父元素是body,所以如果我们想 ...
- ASP.NET MVC在线人数统计
在Global.asax.cs文件中代码: protected void Application_Start() { Application[; AreaRegistration.RegisterAl ...
- 选择排序java代码
/** * 选择排序 * * 原理:将最小值与数组第1个即array[0]交换,第二次则忽略array[0],直接从array[1]至array[array.length-1]中 * 选择出最小值与a ...
- Js杂谈-正则的测试与回溯次数
例子来源于<精通正则表达式(第三版)>这本书,我贴出来: 这里的NFA是正则的一种引擎,书中介绍了一共三种引擎:NFA,DFA和POSIX NFA.像一般我们常用的.NET,java.ut ...
- Java多线程系列--“JUC线程池”05之 线程池原理(四)
概要 本章介绍线程池的拒绝策略.内容包括:拒绝策略介绍拒绝策略对比和示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3512947.html 拒绝策略 ...
- S Gallery – 很有特色的响应式 jQuery 相册插件
S Gallery 是一款响应式的 jQuery 相册插件.使用了 HTML5 全屏 API 以及 CSS3 动画 和 CSS3 转换,所以只能在支持这些功能的浏览器中使用. 这款插件它有一个特色功能 ...
- [New Portal]Windows Azure Virtual Machine (11) 在本地使用Hyper-V制作虚拟机模板,并上传至Azure (1)
<Windows Azure Platform 系列文章目录> 本章介绍的内容是将本地Hyper-V的VHD,上传到Azure数据中心,作为自定义的虚拟机模板. 注意:因为在制作VHD的最 ...
- SQL Server如何在变长列上存储索引
这篇文章我想谈下SQL Server如何在变长列上存储索引.首先我们创建一个包含变长列的表,在上面定义主键,即在上面定义了聚集索引,然后往里面插入80000条记录: -- Create a new t ...
- SQL Server安全(10/11):行级别安全(Row-Level Security)
在保密你的服务器和数据,防备当前复杂的攻击,SQL Server有你需要的一切.但在你能有效使用这些安全功能前,你需要理解你面对的威胁和一些基本的安全概念.这篇文章提供了基础,因此你可以对SQL Se ...
- 开源服务专题之-------rsync数据备份
RSYNC是Remote Sync 远程同步的简称,与SCP的比较,SCP= 无法备份大量数据,类似windows的复制,而rsync=边复制 ,边统计,边比较,可以备份大量数据.可以镜像保存整个目录 ...