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. 深入理解PHP内核(十三)类的结构和实现

    原文链接:http://www.orlion.ga/1117/ 先看一下类的结构: struct _zend_class_entry {     char type;     // „类型:ZEND_ ...

  2. maven -- 学习笔记(三)之搭建nexus私服

    下载和安装nexus (1)官网链接http://www.sonatype.org/nexus/archived/ (直接点击下载链接,发现下载不了,FQ+迅雷就可以下载) (2)解压到指定文件夹,然 ...

  3. [Qt5] Develop openCV3 by QML on Qt-creator

    QML的酷炫控件,适合移动设备开发. qt-creator的跨平台是QML与opencv的粘合剂. 关键: QImage有若干种格式,转化为相应的Mat. Mat处理完后,还要正确得还原为原来格式的Q ...

  4. How does Spring @Transactional Really Work?--转

    原文地址:http://blog.jhades.org/how-does-spring-transactional-really-work/ In this post we will do a dee ...

  5. Canvas 示例:4种超炫的网站动画背景效果

    今天,我们想分享一些动画背景的灵感.全屏背景图片的网站头部是最新的网页设计趋势,已经持续了一段时间.最近人们一直在转向动画添加更多的视觉兴趣到他们的网站中,在这里我们想向您分享几个使用  JavaSc ...

  6. 构建 iOS 风格移动 Web 应用程序的8款开发框架

    使用 HTML5,CSS3 和 JavaScript 开发移动应用经过实践证明是一种可行的方式.这里收录了几款 iOS 风格的手机应用程序开发框架,帮助您使用擅长的 Web 技术来开发移动应用程序.这 ...

  7. 22套新鲜出炉的 Web & Mobile PSD 用户界面素材

    在这篇文章中,我们展示的是自由和清新的 UI 设计素材套件.这些线框图和 UI 设计工具包让设计师在设计用户界面原型的时候能够非常便利. Web 用户界面,移动用户界面和线框套件对设计师很有用,因为这 ...

  8. ASP.NET 文件下载

    using System; using System.Web; using System.IO; public partial class _Default : System.Web.UI.Page ...

  9. ASP.NET MVC必知必会知识点总结(一)

    一.URL Routing 1.添加URL路由映射的一般方法(在RegisterRoutes方法中添加): //第一种(建议采用这种): routes.MapRoute( "MyRoute& ...

  10. 百度地图API实现地图定位

    1.引用JS: <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0& ...