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對異步加載的支持