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 ...
随机推荐
- iOS - SQLite Database 操作数据库
iOS - SQLite Database 操作数据库 Sqlite 能被用在ios上做数据处理用,只要你懂得一点sql 就很容易使用sqlite 1:创建一个简单的View based appl ...
- 在PreparedStatement中设置空值
在PreparedStatement中设置空值 分类: Work& Study java2009-09-10 09:56 922人阅读 评论(0) 收藏 举报 nulltypes数据库 ...
- js对表单设置了readonly和disabled后的区别
Readonly和Disabled是用在表单中的两个属性,它们都能够做到使用户不能够更改表单域中的内容.但是它们之间有着微小的差别,总结如下: 1)Readonly只针对input(text / pa ...
- struts2 日期标签
<td align="center"><s:date name="age" format="yyyy-MM-dd"> ...
- 基本数据结构简介--ath9k网卡驱动开发总结(二)
ath9k驱动代码主要数据结构概览. (1)在ath9k的驱动中,几乎是最顶层的数据结构是ath_softc,这个数据结构几乎随处可见.ath_softc是硬件与MAC层进行交互的中间载体,很多有用的 ...
- Linux 内存机制详解宝典
Linux 内存机制详解宝典 在linux的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(还够用),不会释放其占用内存,就算占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于 ...
- 製程能力介紹(SPC introduction) ─ 製程能力的三種表示法
製程能力的三種表示法 Ck: 準度指標 (accuracy) Ck=(M-X)/(T/2) Cp: 精度指標 (precision) Cp=T/(6σp) 規格為單邊時:Cp=(Tu-X)/3 ...
- Nginx和Nginx+的比较(上)
Nginx和Nginx+的比较(上) 作者:chszs,未经博主允许不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs 一.Nginx+介绍 Nginx和 ...
- [置顶] ProcessOn:划时代性的在线作图工具
ProcessOn是一款专业作图人员的社交网络,这里汇聚很多业界专家.学者,同时他们分享的作品又形成一个庞大的知识图库,你在学习专业知识的同时还可以结交一些志同道合的新朋友. ProcessOn核心设 ...
- rsyslog start with
startswith Checks if the value is found exactly at the beginning of the property value. For example, ...