第一章:异步:现在与稍后

最简单的异步方法是回调函数:

1
2
3
ajax( "http://some.url.1", function myCallbackFunction(data){
console.log( data ); // Yay, 我得到了一些`data`!
} );

1
2
3
4
5
6
7
8
var a = {
index: 1
};
// 稍后
console.log( a ); // ??

// 再稍后
a.index++;

上面的代码将会在你的开发者工具控制台中产生一个你期望的对象表现形式{ index: 1}。但是同样的代码也可能运行在这样的情况下:浏览器告诉后台它需要推迟控制台I/O,这时,在对象在控制台中被表示的那个时间点,a.index++已经执行了,所以它将显示{ index: 2 }。

如果你遇到了这种罕见的情况,最好的选择是使用 JS 调试器的断点,而不是依赖 console 的输出。第二好的选择是通过将目标对象序列化为一个string 强制取得一个它的快照,比如用 JSON.stringify(..)。

“异步”与“并行”两个词经常被混为一谈,但它们实际上是十分不同的。记住,异步是关于现在与稍后之间的间隙。但并行是关于可以同时发生的事情。

第二章:回调

回调是JS中异步的基础单位。

首先,我们的大脑用顺序的,阻塞的,单线程的语义方式规划事情,但是回调使用非线性,非顺序的方式表达异步流程,这使我们正确推理这样的代码变得非常困难。不好推理的代码是导致不好的Bug的不好的代码。

有关于回调的最麻烦的问题就是控制反转导致所有这些信任完全崩溃。

第三章:Promises