JavaScript 异步编程html
第一章 深刻理解JavaScript事件java
1. javascirpt通常是单线程执行,setTimeout 和 setIntervalnode
仅当cpu空闲时执行。编程
var start = new Date; setTimeout(function(){promise
var end = new Date;服务器
console.log('Time elapsed:', end - start, 'ms'); }, 500);多线程
while (new Date - start < 1000) {};并发
解释: setTimeout,有一个延迟事件排入队列,来处理事件。先进先出。和事件的绑定机制同样,dom元素上先绑定先执行。app
2. 异步类型,主要分为I/O异步和计时异步框架
I/O异步主要是XMLHttpRequest请求。计时异步则为setTimeout何setInterval等。在nodeJs中函数名称中添加Sync和Async来区分是否异步。
3. 异步函数编写以及异步异常处理, TODO 将来进一步分析
4. 第一阶段主要使用回调函数
第二章 分布式事件
1. 分布式事件主要利用PubSub模式。具体有Node的EventEmitter对象,Backbone的事件化模型,以及jQuery的自定义事件。
原理:我写过jQuery的自定义事件,基本原理是一个事件源,同时可使得多个地方同步响应。jQuery版本1.7+后优先使用on
2. 对call和apply机制还须要研究 TODO
第三章 Promise对象和Deferred对象
1. Promise和Deferred将回调复杂耦合的结构进行解耦,结构简洁,便于扩展。 (jQuery 1.5+支持)
var promise = $.get('/mydata'); promise.done(onSuccess); promise.fail(onFailure); promise.always(onAlways);
2. Python的Twisted框架 =》 dojo.Deferred对象提出了Promises/A规范
3.
always 在jQuery 1.6+中支持
var promptDeferred = new $.Deferred(); promptDeferred.always(function(){
console.log('A choice was made:'); });
promptDeferred.done(function(){ console.log('Starting game...'); });
promptDeferred.fail(function(){ console.log('No game today.'); });
异步操做生成Promise对象,而提现能够定义Deferred对象,用于异步结果处理。
$('#playGame').focus().on('keypress', function(e) {
var Y = 121, N = 110;
if (e.keyCode === Y) {
promptDeferred.resolve();
} else if (e.keyCode === N) {
promptDeferred.reject(); } else {
return false; // 这里的 Deferred 对象保持着挂起状态 };
});
4. $.when
5. promise.pipe
6. jQuery的Promise和CommonJS的Promises/A基本同样,Q.js库是最流行的Promises/A实现。jQueyr1.8 then来替代pipe.
过去几年,Promise是jQuery最激动人心的新特性之一。再将来返回Promise对象的JavaScript API越多,这些API就越有吸引力。
Promise本人接触的还不多,将来在实际工做中还须要进一步分析和研究,不断提升JavaScript中异步处理的能力。
第四章 Async.js的工做流控制
async.js主要应用在node.js的服务器端,可使得用写同步的方式来写异步函数。
主要提供的函数有:
1. async.filter
2. async.forEach
3. async.filterSeries 和 async.forEachSeries
4. 等参考API设计
5.async.series
6.async.parallel
7.async.queue 相似于银行多窗口工做方式
async.js的可替代品为step.js,比较简洁,能够自定义各类并发函数。
async.js已经成为了数一数二的工做流控制库,它既提供了健壮的迭代式数据收集方法,又实现了可靠的调度 任务的方法。若是遇到了工做流控制问题,Async.js 极可能有解决方 案。若是你喜欢本身解决,不妨使用 Step。
第五章 worker对象的多线程技术
1. worker容许同时启用多个线程
第六章 异步的脚本加载
1. 主要介绍了<script>标签的放置位置
2. HTML5中async/defer对异步加载的支持
defer会在html解析完毕以后再执行;window.load后执行,在DOMcontentLoaded以前。
async表示若是脚本知足条件则执行,可能非顺序执行脚本。
3. yepnope和Request.js对异步加载的支持