1邓深、創(chuàng)造 Node.js樱调,并不是為了人們能在服務(wù)器上運(yùn)行 JavaScript,僅僅是因?yàn)?Ryan Dahl想要一個(gè)建立在某高級語言之上的事件驅(qū)動型服務(wù)器框架。JavaScript碰巧就是適合干這個(gè)的語言毡琉。為什么?因?yàn)镴avaScript語言可以完美地實(shí)現(xiàn)非阻塞式 I/O身冬。
2玄括、WebKit的 console.log 由于表現(xiàn)出異步行為而讓很多開發(fā)者驚詫不已。在Chrome或Safari中银锻,以下這段代碼會在控制臺記錄
{foo:bar} 永品。
var obj = {};
console.log(obj);
obj.foo = 'bar';
3、隊(duì)列
4击纬、回調(diào)
5鼎姐、異步錯(cuò)誤的處理
EventModel/stackTrace.js
function JSONToObject(jsonStr) {
return JSON.parse(jsonStr);
}
var obj = JSONToObject('{');
SyntaxError: Unexpected end of input
at Object.parse (native)
at JSONToObject (/AsyncJS/stackTrace.js:2:15)
at Object.<anonymous> (/AsyncJS/stackTrace.js:4:11)
堆棧軌跡不僅告訴我們哪里拋出了錯(cuò)誤,而且說明了最初出錯(cuò)的地方如果從異步回調(diào)中拋出錯(cuò)誤,會發(fā)生什么事炕桨?讓我們先來做個(gè)測試饭尝。
setTimeout(function A() {
setTimeout(function B() {
setTimeout(function C() {
throw new Error('Something terrible has happened!');
}, 0);
}, 0);
}, 0);
Error: Something terrible has happened!
at Timer.C (/AsyncJS/nestedErrors.js:4:13)
等等,A和 B發(fā)生了什么事献宫?為什么它們沒有出現(xiàn)在堆棧軌跡中钥平?這是因?yàn)檫\(yùn)行 C 的時(shí)候,A和 B并不在內(nèi)存堆棧里姊途。這 3個(gè)函數(shù)都是從事件隊(duì)列直接運(yùn)行的涉瘾。
基于同樣的理由,利用 try/catch 語句塊并不能捕獲從異步回調(diào)中拋出的錯(cuò)誤吭净。
try {
setTimeout(function() {
throw new Error('Catch me if you can!');
}, 0);
} catch (e) {
console.error(e);
}
看到這里的問題了嗎睡汹?這里的 try/catch 語句塊只捕獲 setTimeout函數(shù)自身內(nèi)部發(fā)生的那些錯(cuò)誤。因?yàn)?setTimeout 異步地運(yùn)行其回調(diào)寂殉,所以即使延時(shí)設(shè)置為 0囚巴,回調(diào)拋出的錯(cuò)誤也會直接流向應(yīng)用程序的未捕獲異常處理器總的來說,取用異步回調(diào)的函數(shù)即使包裝上 try/catch 語句塊友扰,也只是無用之舉彤叉。
不過最常見的模式是,針對成敗這兩種情形各規(guī)定一個(gè)單獨(dú)的回調(diào)村怪。始終要記住的是秽浇,只能在回調(diào)內(nèi)部處理源于回調(diào)的異步錯(cuò)誤。
6甚负、多線程性worker
在不損害 DOM響應(yīng)能力的前提下處理復(fù)雜的計(jì)算
? 解碼視頻柬焕。流入的視頻采用 Broadway實(shí)現(xiàn)的 H.264編解碼器
? 采用斯坦福的 JavaScript加密庫加密通信。
? 解析網(wǎng)頁式編輯器中的文本梭域。沒錯(cuò)斑举,就是 Ace編輯器
7、promise和Deferred
通過 ES6 Promise 和 jQuery Deferred 的異同學(xué)習(xí) Promise
8病涨、Async
9富玷、<script> 標(biāo)簽經(jīng)典型和非阻塞型
Require.js/AMD的智能加載