入职百度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的更多相关文章

  1. es6学习笔记-class之一概念

    前段时间复习了面向对象这一部分,其中提到在es6之前,Javasript是没有类的概念的,只从es6之后出现了类的概念和继承.于是乎,花时间学习一下class. 简介 JavaScript 语言中,生 ...

  2. ES6学习笔记<五> Module的操作——import、export、as

    import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...

  3. ES6学习笔记<四> default、rest、Multi-line Strings

    default 参数默认值 在实际开发 有时需要给一些参数默认值. 在ES6之前一般都这么处理参数默认值 function add(val_1,val_2){ val_1 = val_1 || 10; ...

  4. ES6学习笔记<三> 生成器函数与yield

    为什么要把这个内容拿出来单独做一篇学习笔记? 生成器函数比较重要,相对不是很容易理解,单独做一篇笔记详细聊一聊生成器函数. 标题为什么是生成器函数与yield? 生成器函数类似其他服务器端语音中的接口 ...

  5. ES6学习笔记<二>arrow functions 箭头函数、template string、destructuring

    接着上一篇的说. arrow functions 箭头函数 => 更便捷的函数声明 document.getElementById("click_1").onclick = ...

  6. ES6学习笔记<一> let const class extends super

    学习参考地址1  学习参考地址2 ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015:也 ...

  7. JavaScript:学习笔记(9)——Promise对象

    JavaScript:学习笔记(9)——Promise对象 引入Promise Primose是异步编程的一种解决方案,比传统的解决方案回调函数和事件更加合理和强大.如下面为基于回调函数的Ajax操作 ...

  8. ES6学习笔记之块级作用域

    ES6学习笔记:块级作用域 作用域分类 全局作用域 局部作用域 块级作用域 全局作用域示例 var i=2; for (var i = 0; i < 10; i++) { } console.l ...

  9. ES6学习笔记之变量的解构赋值

    变量的解构赋值 ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构. 数组的解构赋值 以前,为变量赋值,只能直接指定值: 1 2 3 var a = 1; var b = 2; ...

随机推荐

  1. http一问一答

    1.用户浏览网站时,发起请求和得到响应的基本过程是什么样的?为什么用户键入一个网址往往会发起多个请求? 首先制作一个非常简单的网页,它的内容只有一行: <html><body> ...

  2. JavaScript---网络编程(9-1)--DHTML技术演示(2-1)-表格创建的几种方式

    一:用最底层的方式,该方式用来创建别的对象树也可以 代码演示: <html> <head> <title>DHTML技术演示---表格创建--用最底层的方式,其实该 ...

  3. ASP.NET 路由

    URL 模式可以包含文本值和变量占位符(也称为“URL 参数”).  文本和占位符位于由斜杠 (/) 字符分隔的 URL 段中. 当生成请求时,URL 分析为段和占位符,变量值提供给请求处理程序.  ...

  4. Bzoj 3236: [Ahoi2013]作业 莫队,分块

    3236: [Ahoi2013]作业 Time Limit: 100 Sec  Memory Limit: 512 MBSubmit: 1113  Solved: 428[Submit][Status ...

  5. Android SeekBar 和 draw9patch 的使用

    今天要使用一个SeekBar控件,其实我觉得Android默认样式已经很不错了,无奈设计不同意,而且SeekBar左右两边也有图片,默认样式和图片也确实不协调,因此这里使用图片自定义SeekBar样式 ...

  6. Linux下SVN命令总结

    目录 一.从版本库获取信息... 1 二.从版本库到本地... 2 三.从本地到版本库... 2 四.高级应用... 4 一.从版本库获取信息 svn help command 获取子命令说明 svn ...

  7. HDU 2298 Toxophily

    题目: Description The recreation center of WHU ACM Team has indoor billiards, Ping Pang, chess and bri ...

  8. C++ 让控制台运行到最后按下回车键才结束的3种方法

    初学C++,弄懂了3种在控制台最后需要按回车键才退出返回编辑框的方法 1.最简单的编译生成后,通过Ctrl+F5运行即可(推荐自己调试的时候用,因为程序在别人那里是一闪而过的) 2.先添加头文件“#i ...

  9. 分享一个dapper简单封装

    using System;using System.Data.Common;using System.Linq;using Dapper;using MySql.Data.MySqlClient; p ...

  10. 【剑指Offer学习】【面试题40:数组中仅仅出现一次的数字】

    题目:一个整型数组里除了两个数字之外.其它的数字都出现了两次,请敲代码找出这两个仅仅出现一次的数字. 要求时间复杂度是O(n),空间复杂度是O(1). 举例说明 比如输入数组{2, 4, 3, 6, ...