JavaScript 的 Promise
先看这个 http://www.html5rocks.com/zh/tutorials/es6/promises/#toc-api 【JavaScript Promise 浏览器支持的Promise】
deferred与Promise http://joseoncode.com/2011/09/26/a-walkthrough-jquery-deferred-and-promise/ 【deferred怎么用】
以及 http://www.cnblogs.com/silin6/p/4309925.html
http://www.shakyshane.com/javascript/2013/11/16/making-promises-with-javascript/ 【deferred 与 Timeout】
还有一个PPT 很棒 http://lucifier129.github.io/nodeppt/20150528/promise.htm 【其中提到jQuery不支持的情况是1.7.2版本以及之前的版本 1.8.0之后都已经支持】
- // jQuery对promise的实现叫做 deferred
- var ajax = $.ajax({
- url: 'http://fanyi.youdao.com/openapi.do',
- type: 'GET',
- dataType: 'jsonp',
- data: {
- 'keyfrom': 'rakustrans',
- 'key': '1506707246',
- 'type': 'data',
- 'doctype': 'jsonp',
- 'version': '1.1',
- 'q': 'synchronize'
- },
- });
- //PS $.get对于dataType可以智能判断 对于json后缀的 可以自动将返回值转为JSON对象 无需parse()
- $.get('story.json').then(function(json){
- console.log(json);
- })
- //ajax本身就是一个延迟对象 也就是deferred
- //https://api.jquery.com/category/deferred-object/
- //所以ajax可以通过.promise() 返回一个promise
- //ajax本身是一个thenable的对象 所以可以使用then
- ajax.then(function(data) {
- console.log(data);
- var rs = $.extend({},data);
- rs.newKey = 'newKey';
- return rs;
- }, function(err) {
- console.log(err);
- }).then(function(data){
- console.log(data);
- },function(err){
- console.log(err);
- });
- //和上面效果一样
- //resolve的值在resolve间
- ajax.promise().then(function(data) {
- console.log(data);
- var rs = $.extend({},data);
- rs.newKey = 'newKey';
- return rs; // 注意 jQ1.7.2的then是不能传递返回值的 //从jQ 1.8 版本之后都支持返回值和promise嵌套
- }, function(err) {
- console.log(err);
- }).then(function(data){
- console.log();
- },function(data){
- console.log();
- });
- $.get('story.txt').then(function(data){
- console.log(data); //字符串
- return JSON.parse(data); //jQ1.7.2 deferred不能传递
- }).then(function(data){
- console.log(data); //jQ1.7.2 deferred不能传递 也就是说不论前一个then的resolve返回什么值 这里data都是第一个then的data
- //所以 jQ1.7.2这里得到的值是字符串 而不是parse后的对象
- });
- $.get('story.txt').then(function(data){
- console.log(data);
- // return $.get('story.json');
- return $.get('story.json').then(function(json){
- json.newKey = 'new';
- return json;
- });
- }).then(function(rs){
- console.log(rs); // jQ1.7.2 deferr不能嵌套(也就是不能在then里面再返回一个promise) 我这里jQ1.11是可以的
- // rs.then(function(data){});
- //报错 rs就是数据 不是一个promise
- //rs 就是上面嵌套的promise的resolve的值
- });
- //使用浏览器的Promsie (Chrome32+)=========================================================================
- function get(url) {
- // 返回一个新的 Promise
- return new Promise(function(resolve, reject) {
- // 经典 XHR 操作
- var req = new XMLHttpRequest();
- req.open('GET', url);
- req.onload = function() {
- // 当发生 404 等状况的时候调用此函数
- // 所以先检查状态码
- if (req.status == 200) {
- // 以响应文本为结果,完成此 Promise
- resolve(req.response);
- } else {
- // 否则就以状态码为结果否定掉此 Promise
- // (提供一个有意义的 Error 对象)
- reject(Error(req.statusText));
- }
- };
- // 网络异常的处理方法
- req.onerror = function() {
- reject(Error("Network Error"));
- };
- // 发出请求
- req.send();
- });
- }
- var story = get('story.json');
- story.then(function(response) {
- console.log("Success!", response);
- }, function(error) {
- console.error("Failed!", error);
- }).then(function(res) {
- console.log(res); //前一个若没有返回值的话这里是undefined
- }, function(err) {
- console.log(err);
- });
- story = get('story.json');
- story.then(function(res){
- return JSON.parse(res);
- }).then(function(obj){
- console.log(obj);
- });
- //可以简写成
- story.then(JSON.parse).then(function(obj) {
- console.log(obj);
- });
- //这是为什么呢 虽然我们看不到JSON.parse的实现(在console中得到的结果是 function parse() { [native code] } )
- //var xxx = JSON.parse(xxx) 说明这个函数接受一个参数且有返回值 所以可以猜测JSON.parse() 大致是 function(str){... retunn obj} 这个样子
- //和前面的完成写法就是一样的
- //再来一个setTimeout的例子
- //我把ajax的例子放在前面是因为我觉得 ajax的使用场景会更容易理解
- var getData = function(){
- var data;
- setTimeout(function(){
- data = 'data';
- },0);
- return data;
- }
- console.log(getData()); //undefined //显然这样是得不到结果的
- //所以我们必须传入一个回调函数
- var getData = function(callback){
- var data;
- setTimeout(function(){
- data = 'data';
- callback(data);
- },0);
- }
- getData(function(data){
- console.log(data)
- });
- //复杂了就不好办了
- // 所以可以这样
- var getData = function(){
- var promise = new Promise(function(resolve, reject){
- setTimeout(function(){
- resolve('data');
- },0);
- });
- return promise;
- }
- getData().then(function(data){
- console.log(data);
- });
- //链式操作 ===========================================================================================
- //Promise的嵌套=======(在then的函数中又返回一个Promise)===============================================
- get('story.json').then(function(data){
- return get('story.txt');
- }).then(function(rs){
- console.log(rs); //虽然前一个Promise返回的是一个Promise对象 但是这里的rs并不是一个Promise 而是前面的Promise对象resolve的结果 //也就是story.txt中的内容
- })
- function getJSON(url) {
- return get(url).then(JSON.parse); //这里返回的是一个promise 且resolve函数的返回值是JSON.parse()后的对象
- }
- var storyPromise;
- function getChapter(i) {
- storyPromise = getJSON('story.json');
- return storyPromise.then(function(story) { //story的值是 JSON.parse(story.json)
- return getJSON(story.chapterUrls[i]);
- //和上面一样 这里虽然又返回了一个新的Promise 但实际上
- });
- }
- function getChapter2(){
- // 上面一段相当于
- var temp1 = get('story.json');
- var temp2 = temp1.then(function(story){
- return JSON.parse(story);
- });
- var temp3 = temp2.then(function(story){
- return get(story.chapterUrls[i]).then(function(data){
- return JSON.parse(data);
- })
- })
- return temp3; //return 的是一个promise 其resolve值又是一个promise 这个promise的resolve值才是对应的chapter的内容
- }
- getChapter(0).then(function(chapter) {
- console.log(chapter);
- return getChapter(1); //就是chapter-2.json
- }).then(function(chapter) {
- console.log(chapter);
- });
- //将jQ的ajax变成标准的Promise ======================================================
- var fetchData = Promise.resolve($.get('story.txt')); //转化为promise对象 //有的是cast 至少Chrome中的Promise是没有cast这个方法的
- fetchData.then(function(result) {
- return JSON.parse(result);
- }).catch(function(error) {
- //handle error
- }).then(function(data){
- console.log(data);
- });
- //Promise 不会立即执行 它仍然是异步的===================================================
- var promise = new Promise(function(resolve, reject) {
- console.log(0);
- resolve(1);
- console.log(2);
- })
- console.log(3);
- promise.then(function(value) {
- console.log(value);
- })
- console.log(4);
- //输出结果是 0 2 3 4 1
- //Promise 语法糖
- Promise.resolve(1);
- //相当于
- new Promise(function(resolve) {
- resolve(1);
- })
- Promise.reject(2);
- //相当于
- new Promise(function(resolve, reject) {
- reject(2);
- })
- Promise.resolve(1).catch(onRejected);
- //相当于
- Promise.resolve(1).then(undefined, onRejected);
JavaScript 的 Promise的更多相关文章
- 全面理解Javascript中Promise
全面理解Javascript中Promise 最近在学习Promise的时候,在网上收集了一些资料,发现很多的知识点不够系统,所以小编特意为大家整理了一些自认为 比较好的文章,供大家更好地学习js中非 ...
- JavaScript中 Promise的学习以及使用
今天一个哥们发过来一段js代码,没看懂,就顺便学习了一下,代码如下 Promise.resolve('zhangkai').then(value => {console.log(value)} ...
- JavaScript Ajax + Promise
AJAX 在现代浏览器上写AJAX主要依靠XMLHttpRequest对象: function success(text) { var textarea = document.getElementBy ...
- JavaScript 初识Promise 对象
什么是Promise? 其实, Promise就是一个类,而且这个类已经成为ES6的标准,是 ECMAScript 6 规范的重要特性之一.这个类目前在chrome32.Opera19.Firefox ...
- JavaScript之Promise对象
含义 Promise 是异步编程的一种解决方案,比传统的解决方案--回调函数和事件--更合理和更强大.它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了 Promise 对象. ...
- JavaScript之Promise学习笔记
一直想知道Promise到底是怎么实现的,网上一搜几十篇文章,看的一脸蒙蔽.最后算是找到几个讲的真心很详细明了的.看了一份源码看了很久很久……最后找大佬问了几处看不懂的地方,大佬只看了十几分钟就看懂了 ...
- JavaScript:理解Promise方法
什么是promise? Promise的核心思想是代表异步操作的一个结果,并且promise具有三个状态(pending初始状态,fulfilled成功状态,rejected失败状态).我们可以理解为 ...
- JavaScript动态加载script方式引用百度地图API 拓展---JavaScript的Promise
上一篇博客JavaScript动态加载script方式引用百度地图API,Uncaught ReferenceError: BMap is not defined 这篇文章中我接触到一个新的单词:Pr ...
- Salesforce Javascript(一) Promise 浅谈
本篇参看: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise https ...
随机推荐
- js基础——属性操作
html属性:属性名——属性值 操作:读 . 写 读操作:用来获取.找到属性名对应的属性值,方法:元素.属性名 例如:var oBtn = document.getElementById('btn1' ...
- Linux学习之less命令
less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大.less 的用法比起 more 更加的有弹性.在 more 的时候,我们并没有办法向前面翻 ...
- Linux学习之常用技巧
▌基础 学习 Bash .你可以man bash来看看bash的东西,并不复杂也并不长.你用别的shell也行,但是bash是很强大的并且也是系统默认的.(学习zsh或tsch只会让你在很多情况下受到 ...
- tomcat 设置session 时间
Tomcat Session过期时间 Tomcat采用数据库连接池技术,当用户在一定时间不对数据库有操作时间后,就自动关闭这个连接,这是为了更好的利用资源,防止浪费宝贵的数据库连接资源. 可以采用如 ...
- Mysql中时间的操作笔记
1.创建修改表时,为datetime字段设置当前时间为默认值 CREATE TABLE `NewTable` ( `id` int(11) NOT NULL AUTO_INCREMENT , `des ...
- [置顶] js 控制文章中字体的大小,mootools实现
文中字体要12.14.16号中选择: <span class="zh">字号:<b class="change-font">12< ...
- 如何实现select组件的选择输入过滤作用
实现select组件的选择输入过滤作用的js代码如下: /** *其中//******之间的部分显示的是在没有选择输入过滤功能的代码上加入的功能代码 ** / (function ( $ ) { $. ...
- 学习笔记(一) HTML+CSS基础课程
这个周把慕课网的<HTML+CSS基础课程>课程学完,内容都是非常非常基础的,不过还是学到了几个小知识点,记下来先. <a>超链接发送邮件 直接上把他的图片给挪过来了,我就不打 ...
- java反射机制(笔记)
java反射机制就是获取出class的相应方法 例如 获取构造函数: 模版: Class test = Class.forName("cn.test.Person");//得到相应 ...
- OpenNMS Log Correlator