最新的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的更多相关文章

  1. 面向面试题和实际使用谈promise

    "金三银四,金九银十",都是要收获的季节.面对各种面试题,各种概念.原理都要去记,挺枯燥的.本文是面向面试题和实际使用谈一下Promise. Promise是什么? Promise ...

  2. 浅谈Promise

    学习过JavaScript的人都知道,JavaScript是单线程作业,这样会有一个很大的缺陷,所有的Ajax,浏览器事件等,都是通过异步去完成.所谓的同步和异步最大的区别无非就是在于同步会阻塞后续代 ...

  3. 再谈Promise

    方法 构造函数 接受的参数是一个带两个Function参数的函数,实际的异步代码编写在这个函数里,成功后调用第一个参数,失败调用第二个: Promise.prototype.catch 当构造函数里调 ...

  4. 再谈 Promise

    读完这篇文章,预计会消耗你 40 分钟的时间. Ajax 出现的时候,刮来了一阵异步之风,现在 Nodejs 火爆,又一阵异步狂风刮了过来.需求是越来越苛刻,用户对性能的要求也是越来越高,随之而来的是 ...

  5. 浅谈Promise原理与应用

    在JavaScript中,所有代码都是单线程.由于该“缺陷”,JavaScript在处理网络操作.事件操作时都是需要进行异步执行的.AJAX就是一个典型的异步操作 对于异步操作,有传统的利用回调函数和 ...

  6. async/await,了解一下?

    上一篇博客我们在现实使用和面试角度讲解了Promise(原文可参考<面向面试题和实际使用谈promise>),但是Promise 的方式虽然解决了 callback hell,但是这种方式 ...

  7. async和await是如何实现异步编程?

    目录 异步编程样例 样例解析 浅谈Promise如何实现异步执行 参考 1.异步编程样例 样例: // 等待执行函数 function sleep(timeout) { return new Prom ...

  8. asap异步执行实现原理

    目录 为什么分析asap asap概述 asap源码解析-Node版 参考 1.为什么分析asap 在之前的文章 async和await是如何实现异步编程? 中的浅谈Promise如何实现异步执行小节 ...

  9. 浅谈Angular的 $q, defer, promise

    浅谈Angular的 $q, defer, promise 时间 2016-01-13 00:28:00  博客园-原创精华区 原文  http://www.cnblogs.com/big-snow/ ...

随机推荐

  1. hdu 5233 离散化

    10^9的大数组显然开不了.所以也算比较裸的离散化了... 令pos[i].pp[j]表示从左到右第j个高度为i的树的位置 (pp是个vector,范围0..now-1) pos[i].num表示有几 ...

  2. shell命令xargs

    今天准备找出nginx非空的日志并压缩成一个文件 find . -name "meta.access.log.*" -type f -size +0k | tar -cjv -f ...

  3. 看看你的正则行不行——正则优化一般的json字符串

    json字符串很有用,有时候一些后台接口返回的信息是字符串格式的,可读性很差,这个时候要是有个可以格式化并高亮显示json串的方法那就好多了,下面看看一个正则表达式完成的json字符串的格式化与高亮显 ...

  4. django redis VS memcache 区别简介

    https://www.v2ex.com/t/142644 http://stackoverflow.com/questions/10558465/memcached-vs-redis 简单来说: r ...

  5. mysql 生成排名字段

    假设有test表,下图为表机构和数据,score表示积分.现在要查询积分排名为第几的id?? 查询语句 select id,score,(@rowno:=@rowno+1) as rowno from ...

  6. CSS3-实现单选框radio的小动画

    在微信上看到一个教程文,觉得制作的小动画还是很有意思的,自己也试验了一下.一开始动画怎么都不执行(我用的HB),因为内置浏览器对css3的不兼容.加上各种浏览器前缀后就好了.但是旋转那个效果,在HB里 ...

  7. 什么是xmlschema

    XML Schema定义(XML Schema Definition,XSD)是一套W3C标准,用于基于XML的称为XML Schema的类型系统.用于定义的语言是一种称为XML模式定义语言(XML ...

  8. Mysql数据库设置定时任务

    最近手头在做一个拍卖的电商项目. 中间需要将到点的拍卖会状态设置为进行中. 我们的解决方案是Mysql的定时器任务,这里进行一个简单的总结. 1.使用范围 不是所有的MySQL版本都支持,Mysql ...

  9. electron photobooth.js

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. LINUX 下chmod|chown|chgrp和用法和区别

    1.chgrp(转变文件所属用户组) chgrp 用户组 文件名 ###便是这个格了.若是整个目次下的都改,则加-R参数用于递归. 如:chgrp -R user smb.conf 2.chown(转 ...