从现在到将来的等待最简单的方法(但绝对不是唯一的,甚至也不是最好的!)是使用一个通常称为回调函数的函数。
任何时候,只要把一段代码包装成一个函数,并指定它在响应某个事件(定时器、鼠标点击、ajax响应等)时执行,你就是在代码中创建了一个将来执行的块,也由此在这个程序中引入了异步的机制。
如果在调试的过程中遇到对象在console.log(...)语句之后被修改,可你却看到了依赖之外的结果,要意识到这可能是I/O的异步化造成的。
强制快照或使用断点:如果遇到这种很少见的情况,最好的选择是在JavaScript调试器中使用断点,而不是依赖控制台输出。次优的方案是吧对象序列化到一个字符串中(JSON.stringify),以强制执行一次快照。
setTimeout并没有把回调函数挂在事件循环队列中。它所做的是设定一个定时器。当定时器到时后,环境会把回调函数放在事件循环中,这样在未来的某个时刻会执行这个回调。
如果这个时候事件循环中已经有n个项目,回调就会等待,它得排在其他项目后面-通常没有抢占式的方式支持直接将其排到队首。这也解释了为什么setTimeout定时器的精度可能不高。
异步是关于现在和将来的时间间隙,而并行是关于能够同时发生的事情。
门闩思想
var a,b; function foo(x){ a = x * 2 if(a && b){ baz() } } function bar(y){ b = y * 2 if(a && b){ baz() } } function baz(){ console.log(a + b) } ajax(‘test/a‘,foo) ajax(‘test/b‘,bar)
第一个可以通过,第二个(实际上是任何后续的)调用会被忽略。第二名没有意义。
var a; function foo(x){ if(!a){ a = x * 2; baz() } } function bar(x){ if(!a){ a = x / 2; baz() } } function baz(){ console.log(a) } ajax(‘/zjy/a‘,foo) ajax(‘/zjy/b‘,bar)
未完待续...
原文:https://www.cnblogs.com/zhenjianyu/p/13295353.html