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对象的更多相关文章

  1. Nodejs与ES6系列3:generator对象

    3.generator对象 Generator函数是ES6提供的一种异步编程解决方案,语法行为与传统函数完全不同.Generator的中文翻译是生成器,它是ECMAScript6(代号harmory) ...

  2. es6中的promise对象

    Promise是异步里面的一种解决方案,解决了回调嵌套的问题,es6将其进行了语言标准,同意了用法,提供了`promise`对象, promise对象有三种状态:pending(进行中) .Resol ...

  3. es6学习笔记--promise对象

    Promise对象是为了简化异步编程.解决回调地狱情况 Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果.从语法上说,Promise 是一个对象,从它可 ...

  4. [js高手之路] es6系列教程 - promise常见用法详解(resolve,reject,catch,then,all,race)

    关于promise我在之前的文章已经应用过好几次,如[js高手之路]Node.js+jade+express+mongodb+mongoose+promise实现todolist,本文就来讲解下pro ...

  5. ES6入门之Promise对象

    1. Promise 的含义 Promise 是异步编程的一种解决方案,比传统的解决方案--回调函数和事件更合理.更强大. 1.1 什么是Promise 简单来说就是一个容器,里面保存着某个未来才会结 ...

  6. Nodejs与ES6系列4:ES6中的类

    ES6中的类 4.1.class基本语法 在之前的javascript语法中是不存在class这样的概念,如果要通过构造函数生成一个新对象代码 function Shape(width,height) ...

  7. ES6系列_9之对象

    1.对象赋值 es5中的对象赋值方式如下: let name="小明"; let skill= 'es6开发'; var obj= {name:name,skill:skill}; ...

  8. Nodejs与ES6系列1:变量声明

    1.声明变量 在JS当中一个变量的作用域(scope)是程序中定义这个变量的区域.变量分为两类,全局(global)的和局部的.其中全局变量的作用域是全局性的,即在JavaScript代码中,它处处都 ...

  9. ES6的promise对象应该这样用

    ES6修补了一位Js修真者诸多的遗憾. 曾几何时,我这个小白从js非阻塞特性的坑中爬出来,当我经历了一些回调丑陋的写法和优化的尝试之后,我深深觉得js对于多线程阻塞式的开发语言而言,可能有着其太明显的 ...

随机推荐

  1. VS报错:_CRT_SECURE_NO_WARNINGS

    常见报错:warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead ...

  2. 如何查看某个查询用了多少TempDB空间

        最近帮助客户调优的过程中,发现客户的TempDB存在非常大的压力,经过排查是发现某些语句对TempDB的巨量使用所导致.     在SQL Server中,TempDB主要负责供下述三类情况使 ...

  3. Android属性动画之ObjectAnimator

    相信对于Android初学者,对于Android中的动画效果一定很感兴趣,今天为大家总结一下刚刚学到的属性动画案例. 首先和一般的Android应用一样,我们先建一个工程,为了方便,我们的布局文件中就 ...

  4. 包管理器Bower

    今天自己用Angular写东西的时候,下载了Angular-seed项目,发现需要用到bower,之前也使用过,没有仔细了解,今天趁机了解到一些. bower的官网地址: http://bower.i ...

  5. JavaScript垃圾回收(二)——垃圾回收算法

    一.引用计数(Reference Counting)算法 Internet Explorer 8以下的DOM和BOM使用COM组件所以是引用计数来为DOM对象处理内存,引用计数的含义是跟踪记录每个值被 ...

  6. Windows 下搭建 Ruby 开发环境

    1.从http://rubyinstaller.org/downloads/下载“rubyinstaller-2.1.5-x64.exe”. 2. 双击下载的程序进行安装,勾选如下图的选项.默认安装目 ...

  7. 决战JS(二)

    紧接着上次的<决战JS>,分析总结一些比较实用的DEMO与新手分享,望大神拍砖. demo5.点击隐藏: 要实现这个功能只需要知道在onclick事件中加入对父节点的样式dislay设置为 ...

  8. Jsp字符编码过滤器

    通过此过滤器,可以实现统一将编码设置为UTF-8. 1.首先在web.xml中配置,添加如下代码: <!-- 过滤器 --> <filter> <filter-name& ...

  9. Eclipse10个最有用的快捷键[From: Internet]

    1. ctrl+shift+r:打开资源这可能是所有快捷键组合中最省时间的了.这组快捷键可以让你打开你的工作区中任何一个文件,而你只需要按下文件名或mask名中的前几个字母,比如applic*.xml ...

  10. Azure ARM (4) 开始创建ARM Resource Group并创建存储账户

    <Windows Azure Platform 系列文章目录> 好了,接下来我们开始创建Azure Resource Group. 1.我们先登录Azure New Portal,地址是: ...