ES6学习笔记之Promise
入职百度EFE团队实习已经三周了,实习中接触到了生产环境的技术和开发流程,大开眼界,和自己在学校接小作坊式项目是很不一样的体验。其中一个很大的感触是,ES6早已不是“选修”的尝鲜技术,而是已经全面普及应用、非学不可的“必修”技术,看来该版本新加入的特性的确解决了前端项目开发中的痛点,有利于提升开发效率。
说到ES6,像let,const,箭头函数这些特性简单易懂,很快就实现了无痛上手;然而Promise不是那么直观,项目文档里大量的“返回一个Promise对象”让初接触这一概念的我一度懵比,于是花了些脑筋去学习它,并感觉值得写一篇博客来谈一下我对它的理解。
我们知道,在ES5中,调用异步操作的方法如ajax、查询数据库等时,往往需要传一个回调函数来响应异步的返回结果,造成嵌套,而如果在回调函数里又有异步操作,就会造成更深的嵌套。。嵌套层级过深会使得代码可读性很差,对象字面量的花括号与函数的花括号齐飞,this也难以判断其运行时指向,造成“回调金字塔”现象,十分不利于开发和维护。在这种形势下,Promise应运而生,可谓众望所归。
Promise到底是什么?它是一个对象,正如其字面意思所示,它代表一个异步操作的“承诺”:这事包在我身上,虽然不知道啥时候能办好,但我会负责到底!
当我们new一个Promise对象时,需向其构造函数传入一个function,该function有两个参数分别是resolve和reject,分别代表两个函数,皆由js引擎实现好了,直接调用即可。接下来可以在函数体里做一些异步操作,然后执行成功时调用resolve,并将期望交给下一步的值(如服务器端的response)传给resolve;失败时调用reject,使用方法同理。举个用ajax模拟fetch的例子:
function fetchMessage(url) {
return new Promise(function(resolve, reject) {var xhr = new XMLHttpRequest();
xhr.open("GET",url);
xhr.send(null);
xhr.onreadystatechange = function() {
if ((xhr.readyState == 4) && (xhr.status == 200)) {
resolve(xhr.responseText);
}
else {
reject(new Error('Ajax fail'));
}
}
});
} fetchMessage("105.108.99.6").then(function (resText){
console.log(resText);
}).catch(function (error){
console.error("Error", error);
}};
这段代码里,我们调用fetchMessage函数获得一个Promise对象,即“得到一份承诺”,然后我们调用它的then方法传入一个回调函数,这个回调在resolve被调用后被调用,传入resolve的实参会被传给这个回调,可以理解为“承诺兑现之后,你就干这个”,then方法也会返回一个Promise对象,并且将回调的返回值传给resolve,如此可以形成链式调用,彻底解决;catch方法与then类似,但它接收的回调在reject被调用后调用,用于捕获处理异常情况,理解为“若是承诺未能兑现,那么你就这么办”。注意,这里的catch实际上是被then方法返回的Promise对象所调用,这说明了Promise的另一个性质:传导性。前一个Promise若是执行了resovle,则其then方法返回的Promise也将立即执行resovle;前一个Promise若是执行了reject,则其then方法的回调将不被调用,then方法仍将返回一个Promise,但立即执行其reject并将错误继续传递下去,直到被catch或调用链结束。
好了,讲到这里Promise对象应该会用了吧?让ES6带你远离回调金字塔的噩梦,把异步代码写出同步的快感!
ES6学习笔记之Promise的更多相关文章
- es6学习笔记-class之一概念
前段时间复习了面向对象这一部分,其中提到在es6之前,Javasript是没有类的概念的,只从es6之后出现了类的概念和继承.于是乎,花时间学习一下class. 简介 JavaScript 语言中,生 ...
- ES6学习笔记<五> Module的操作——import、export、as
import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...
- ES6学习笔记<四> default、rest、Multi-line Strings
default 参数默认值 在实际开发 有时需要给一些参数默认值. 在ES6之前一般都这么处理参数默认值 function add(val_1,val_2){ val_1 = val_1 || 10; ...
- ES6学习笔记<三> 生成器函数与yield
为什么要把这个内容拿出来单独做一篇学习笔记? 生成器函数比较重要,相对不是很容易理解,单独做一篇笔记详细聊一聊生成器函数. 标题为什么是生成器函数与yield? 生成器函数类似其他服务器端语音中的接口 ...
- ES6学习笔记<二>arrow functions 箭头函数、template string、destructuring
接着上一篇的说. arrow functions 箭头函数 => 更便捷的函数声明 document.getElementById("click_1").onclick = ...
- ES6学习笔记<一> let const class extends super
学习参考地址1 学习参考地址2 ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015:也 ...
- JavaScript:学习笔记(9)——Promise对象
JavaScript:学习笔记(9)——Promise对象 引入Promise Primose是异步编程的一种解决方案,比传统的解决方案回调函数和事件更加合理和强大.如下面为基于回调函数的Ajax操作 ...
- ES6学习笔记之块级作用域
ES6学习笔记:块级作用域 作用域分类 全局作用域 局部作用域 块级作用域 全局作用域示例 var i=2; for (var i = 0; i < 10; i++) { } console.l ...
- ES6学习笔记之变量的解构赋值
变量的解构赋值 ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构. 数组的解构赋值 以前,为变量赋值,只能直接指定值: 1 2 3 var a = 1; var b = 2; ...
随机推荐
- 全新ASP框架——IISNODE介绍
Asp是一门经典的动态网页编程语言,通常使用vbscript或者Jscript脚本来实现.一个好的框架,可以帮助您更加快速地使用Asp来完成您的网站开发任务.而Asp框架的终结者——IISNODE框架 ...
- Ubuntu12.04-64bits搭建FFmpeg环境
所有的环境搭建动作请参考FFMpeg官方网站:http://www.ffmpeg.org/index.html 1. 获取源代码: git clone git://source.ffmpeg.org/ ...
- Centos6.x X64 飞信安装
Centos6.x X64 飞信安装 1,安装飞信依赖包 yum -y install glibc.i686 krb5-libs.i686 libstdc++.i686 zlib.i686 --set ...
- 第十一章、认识与学习 BASH Bash Shell 的操作环境
bash中的变量动不动就说环境变量,真是奇怪,bash只是一个c语言编写的程序而已,跟环境变量有什么关系?如果知道dos的历史的话就知道有个时代是只有命令行界面而没有图形用户界面,这只小小的程序就包揽 ...
- How I Mathematician Wonder What You Are! - POJ 3130(求多边形的核)
题目大意:判断多多边形是否存在内核. 代码如下: #include<iostream> #include<string.h> #include<stdio.h> # ...
- Java NIO使用及原理分析(三)
在上一篇文章中介绍了缓冲区内部对于状态变化的跟踪机制,而对于NIO中缓冲区来说,还有很多的内容值的学习,如缓冲区的分片与数据共享,只读缓冲区等.在本文中我们来看一下缓冲区一些更细节的内容. 缓冲区的分 ...
- xml 与 DataSet 互相转换
本文转载:http://www.cnblogs.com/30ErLi/archive/2010/09/21/1832694.html XmlDatasetConvert 该类提供了四种方法: 1.将x ...
- RichtextBox去除闪烁光标
http://files.cnblogs.com/xe2011/CustomRichTextBox_HideCaret.rar richTextBox能高亮选择,光标仍在,没有光标闪烁 把重RichT ...
- 2014 百度之星题解 1002 - Disk Schedule
Problem Description 有非常多从磁盘读取数据的需求,包含顺序读取.随机读取.为了提高效率,须要人为安排磁盘读取.然而,在现实中,这样的做法非常复杂.我们考虑一个相对简单的场景. 磁盘 ...
- HDU2019JAVA
数列有序! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submissi ...