JavaScript 异步编程
第一章 深入理解JavaScript事件
1. javascirpt一般是单线程执行,setTimeout 和 setInterval
仅当cpu空闲时执行。
var start = new Date; setTimeout(function(){
var end = new Date;
console.log(‘Time elapsed:‘, end - start, ‘ms‘); }, 500);
while (new Date - start < 1000) {};
解释: setTimeout,有一个延迟事件排入队列,来处理事件。先进先出。和事件的绑定机制一样,dom元素上先绑定先执行。
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对异步加载的支持