JS异步编程

1、创造 Node.js,并不是为了人们能在服务器上运行 JavaScript,仅仅是因为 Ryan Dahl想要一个建立在某高级语言之上的事件驱动型服务器框架。JavaScript碰巧就是适合干这个的语言。为什么?因为JavaScript语言可以完美地实现非阻塞式 I/O。

2、WebKit的 console.log 由于表现出异步行为而让很多开发者惊诧不已。在Chrome或Safari中,以下这段代码会在控制台记录
{foo:bar} 。

var obj = {};
console.log(obj);
obj.foo = 'bar';

3、队列

4、回调

5、异步错误的处理
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. (/AsyncJS/stackTrace.js:4:11)

堆栈轨迹不仅告诉我们哪里抛出了错误,而且说明了最初出错的地方如果从异步回调中抛出错误,会发生什么事?让我们先来做个测试。

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发生了什么事?为什么它们没有出现在堆栈轨迹中?这是因为运行 C 的时候,A和 B并不在内存堆栈里。这 3个函数都是从事件队列直接运行的。
基于同样的理由,利用 try/catch 语句块并不能捕获从异步回调中抛出的错误。

try {
setTimeout(function() {
throw new Error('Catch me if you can!');
}, 0);
} catch (e) {
console.error(e);
}

看到这里的问题了吗?这里的 try/catch 语句块只捕获 setTimeout函数自身内部发生的那些错误。因为 setTimeout 异步地运行其回调,所以即使延时设置为 0,回调抛出的错误也会直接流向应用程序的未捕获异常处理器总的来说,取用异步回调的函数即使包装上 try/catch 语句块,也只是无用之举。
不过最常见的模式是,针对成败这两种情形各规定一个单独的回调。始终要记住的是,只能在回调内部处理源于回调的异步错误。
6、多线程性worker
在不损害 DOM响应能力的前提下处理复杂的计算
 解码视频。流入的视频采用 Broadway实现的 H.264编解码器
 采用斯坦福的 JavaScript加密库加密通信。
 解析网页式编辑器中的文本。没错,就是 Ace编辑器

7、promise和Deferred

JS异步编程_第1张图片
Paste_Image.png

通过 ES6 Promise 和 jQuery Deferred 的异同学习 Promise

8、Async
9、

你可能感兴趣的:(JS异步编程)