2.1 continuation
// A
ajax('..', function(..){
//C
})
//B
A 和 B 表示重新的前半部分,而 C 标识了后并部分。前半部分立即执行,然后是等待。在未来某个时刻,如果Ajax调用完成,重新就会从停下的位置继续执行后半部分。
我们的顺序阻塞式的大脑计划行为无法很好地映射到面向回调的异步代码。这就是回调方式最主要的缺陷:对于它们在代码中表达异步的方式,我们的大脑需要努力才能同步得上。
2.3 信任问题
顺序的人脑计划和回调轻动的异步JS代码之间的不匹配只是回调问题的一部分。还有一些更深入的问题需要考虑。
//A
ajax('...', function(){
//C
})
//B
A 和 B 发生于现在,在JS主程序的直接控制之下。C 会延迟到将来发生,并且是在第三方的控制下(ajax)。有时ajax回调不是你编写的代码,也不在你的直接控制下。
我们把这称为控制反转(inversion of control)。
确保调用一次
var tracked = false;
analytics.trackPurchase(purchaseData, function(){
if(!tracked){
tracked = true;
chargeCreditCard();
displayThankyouPage();
}
})