首页 > 其他 > 详细

异步和性能

时间:2020-07-15 01:33:01      阅读:50      评论:0      收藏:0      [点我收藏+]

从现在到将来的等待最简单的方法(但绝对不是唯一的,甚至也不是最好的!)是使用一个通常称为回调函数的函数。

任何时候,只要把一段代码包装成一个函数,并指定它在响应某个事件(定时器、鼠标点击、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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!