首页 > 技术文章 > JavaScript 异步编程

purejade 2016-05-04 16:25 原文

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对异步加载的支持

推荐阅读