也谈Promise
最新的ES6标准添加有Promise方法,但自己在项目中一直使用jQuery(jQuery自己实现了不标准的Promise),加上es6标准还没有得到普及,也就懒得学习相关资料。
最近手头上的活少了,本着好好学习,天天向上的宗旨,便查了些资料,学习下Promise。
我们都知道js是单线程的,意味着在同一时间段,浏览器只能解析一段脚本。这很让人抓狂啊。想想你自己,同一时间只能吃零食或看电影,不能边吃零食边看电影,那得多崩溃啊。
许多时候,我们的业务需求需要保证这样的数据流向:A->B->C->...>X
基于事件回调,我们可以把事件一层层嵌套,一层层回调。但这很容易导致回调金字塔。
Promise基于这些类似的业务场景,提供给了我们解决事件回调的方案。
===============================================================
Promise
1.构造一个promise对象
 var promise = new Promise(function(resolve, reject) {
             // do a thing, possibly async, then…
             if (/* everything turned out fine */) {
                 resolve("Stuff worked!");
             }
             else {
                 reject(Error("It broke"));
             }
         });
Promise的构造器接受一个函数作为参数,它会传递这个回调函数两个变量resolve和reject。在回调函数中你可以做一些异步操作,成功之后调用resolve,否则调用reject。
2.Promise的使用
 promise.then(function(result) {
   console.log(result); // "Stuff worked!"
 }, function(err) {
   console.log(err); // Error: "It broke"
 });
这里有两个回调,第一个回调对应实例化Promise时reslove方法,第二个回调则对应reject方法。当然,这两个函数都是可选的,是否使用基于个人需要。
3.Promise的链式调用
Promise强大的地方就在于它不仅可以配平回调金字塔,而且可以链式调用,每一次调用then函数,都会返回一个Promise类。
 var promise = new Promise(function(resolve, reject) {
   resolve(1);
 });
 promise.then(function(val) {
   console.log(val); //
   return val + 2;
 }).then(function(val) {
   console.log(val); //
 });
这里神奇的地方就在于then函数的返回。如果你返回一个值,它就会被传给下一个then回调;而如果你返回一个Promise对象,则下一个then就会等待这个Promise明确结束(成功或失败)才会失败。
===============================================================
最佳实践
我们有如下需求,需要首先load到数据1,数据1成功返回后才继续load数据2。用Promise来实现,就是下面的代码,大家可以参考学习下
 var getData1 = function () {
             return new Promise(function (resolve, reject) {
                 $.ajax({
                     dataType: "json",
                     url: 'testData1.json',
                     success: function (data) {
                         resolve(data);
                     },
                     error: function (err) {
                         reject(err);
                     }
                 });
             });
         }
         var getData2 = function () {
             return new Promise(function (resolve, reject) {
                 $.ajax({
                     dataType: "json",
                     url: 'testData2.json',
                     success: function (data) {
                         resolve(data);
                     },
                     error: function (err) {
                         reject(err);
                     }
                 });
             });
         }
         getData1().then(function (res) {
             console.log('####data1');
             console.log(res);
             return getData2();
         }).then(function (res) {
             console.log('####data2');
             console.log(res);
         });
我把获取数据1和数据2分成两个方法来实现。在getData1的then回调中,返回getData2,这样就能保证load到数据1再去load数据2.
=================================================================================
Promise确实强大,但可惜的是,现在能支持es6特性的浏览器不多。很多情况下,原生的Promise不是我们的首选。
上面讲到的这些特性只是一些基本的特性,它还有许多强大的特性需要我们去挖掘。
假以时日,浏览器端完成统一大战,ES6得到广泛支持,那将是前端界的一大幸事,虽然前路漫漫,但我们依旧翘首以待!
也谈Promise的更多相关文章
- 面向面试题和实际使用谈promise
		
"金三银四,金九银十",都是要收获的季节.面对各种面试题,各种概念.原理都要去记,挺枯燥的.本文是面向面试题和实际使用谈一下Promise. Promise是什么? Promise ...
 - 浅谈Promise
		
学习过JavaScript的人都知道,JavaScript是单线程作业,这样会有一个很大的缺陷,所有的Ajax,浏览器事件等,都是通过异步去完成.所谓的同步和异步最大的区别无非就是在于同步会阻塞后续代 ...
 - 再谈Promise
		
方法 构造函数 接受的参数是一个带两个Function参数的函数,实际的异步代码编写在这个函数里,成功后调用第一个参数,失败调用第二个: Promise.prototype.catch 当构造函数里调 ...
 - 再谈 Promise
		
读完这篇文章,预计会消耗你 40 分钟的时间. Ajax 出现的时候,刮来了一阵异步之风,现在 Nodejs 火爆,又一阵异步狂风刮了过来.需求是越来越苛刻,用户对性能的要求也是越来越高,随之而来的是 ...
 - 浅谈Promise原理与应用
		
在JavaScript中,所有代码都是单线程.由于该“缺陷”,JavaScript在处理网络操作.事件操作时都是需要进行异步执行的.AJAX就是一个典型的异步操作 对于异步操作,有传统的利用回调函数和 ...
 - async/await,了解一下?
		
上一篇博客我们在现实使用和面试角度讲解了Promise(原文可参考<面向面试题和实际使用谈promise>),但是Promise 的方式虽然解决了 callback hell,但是这种方式 ...
 - async和await是如何实现异步编程?
		
目录 异步编程样例 样例解析 浅谈Promise如何实现异步执行 参考 1.异步编程样例 样例: // 等待执行函数 function sleep(timeout) { return new Prom ...
 - asap异步执行实现原理
		
目录 为什么分析asap asap概述 asap源码解析-Node版 参考 1.为什么分析asap 在之前的文章 async和await是如何实现异步编程? 中的浅谈Promise如何实现异步执行小节 ...
 - 浅谈Angular的 $q, defer, promise
		
浅谈Angular的 $q, defer, promise 时间 2016-01-13 00:28:00 博客园-原创精华区 原文 http://www.cnblogs.com/big-snow/ ...
 
随机推荐
- 下载Spring的jar包的方法
 - 【随笔】mvc使用forms身份验证实现登陆
 - XHTML与HTML的区别
			
XHTML:可扩展超文本标记语言,是一种置标语言,表现方式与超文本标记语言(HTML)类似,不过语法上更加严格. 参考:http://baike.baidu.com/search/word?word= ...
 - 洛谷P2242 公路维修问题(Road)
			
题目描述 在一个夜黑风高,下着暴风雨的夜晚,farmer John的牛棚的屋顶.门被吹飞了. 好在许多牛正在度假,所以牛棚没有住满. 牛棚一个紧挨着另一个被排成一行,牛就住在里面过夜. 有些牛棚里有牛 ...
 - 系统安装之:虚拟机VMware V12.0.1 专业版 + 永久密钥
			
撰写日期:2016-6-30 10:30:26 转自:http://blog.sina.com.cn/s/blog_4549d6770102vxue.html VMware V12.0.1 专业 ...
 - TortoiseSVN 过滤文件(包括已提交和未提交)
			
一:svn 设置过滤文件方式 1.选中需要过滤的文件夹或者文件---右键---TortoiseSVN---Add to Ignore list(如果不显示说明该目录已经被添加) 2.在当前工作区域 不 ...
 - BZOJ4653: [Noi2016]区间
			
传送门 UOJ上卡掉一个点,COGS上卡掉两个点..弃疗,不改了,反正BZOJ上过啦hhh 先把区间按长度递增排序.然后每次用线段树维护区间最大覆盖次数,用一个指针随便扫扫就行了. //NOI 201 ...
 - 使用canvas绘制时钟
			
使用canvas绘制时钟 什么使canvas呢?HTML5 <canvas> 元素用于图形的绘制,通过脚本 (通常是JavaScript)来完成.<canvas> 标签只是图 ...
 - Objective-C之字典
			
//字典:(关键字 值) //插入代码字太小 // NSArray *array = [NSArray array];//空数组 // NSDictionary *dict ...
 - Jquery 基本知识(二)
			
一.数据类型 5种基本数据类型:Null/Undefined/String/Boolean/Number 1种复杂数据类型:Object 二.数据类型检测 1.typeof 2.instanceof/ ...