关于javascript回调和异步问题

2025-03-07 16:39:46
推荐回答(4个)
回答1:

多线程么?在JS里面是没有多线程这个概念的。

但是可以用ajax或者setTimeout以及setInterval来模拟的,如:

function main(){
    alert("主线程开始!");
    //setTimeout接收两个参数,第一个参数是一个函数指针,第二个是整数,代表多少毫秒后执行第一个参数所指向的这个函数。
    setTimeout(thread, 5000);
    alert("主线程结束!");
}
function thread(){
    alert("附线程开始!");
    alert("附线程结束!");
}

回答2:

javascript引擎是多线程的,可以理解为javascript引擎中有一个任务队列,所有的操作都可以被视为任务,当多个任务需要被执行时会放入到任务队列中由一个线程(就叫执行线程吧)顺序执行。那么如何实现异步呢,比如settimeout和setinterval,还有ajax。

settimeout/setinterval:settimeout和setinterval也可以视为任务,当执行到settimeout/setinterval时将其放入任务队列,同时通知javascirpt引擎用另一个线程计时,计时线程在计时完成时再放一个标记触发settimeout/setinterval的任务(自己想象的,不一定真的是这样实现的)到任务队列中。这样,只有任务队列中排在之前的任务完成之后才会去执行settimeout/setinterval的定时方法。这样就能在单线程的情况下实现看起来是异步的效果。

ajax:ajax也是大同小异,javascript在发送请求的时候,由javascript引擎创建新的线程去发送(这个过程可以是真异步哦)请求,当请求结束后(成功/失败都视为结束)在任务队列中放入回调任务,待排在任务队列前面的任务全都执行完成后才会调用ajax请求的回调方法。虽然看起来是异步的,但是仍然是在一个线程中完成的。


语言组织能力有限,有问题大家再互相交流吧

参考资料:http://www.laruence.com/2009/09/23/1089.html


另外附上几个验证方法

以下程序运行的结果是什么?

setTimeout(function(){alert("setTimeout invoked");},1000);
while(true){
}
setTimeout(function(){
    while(true){
    }
},1000);

setInterval(function(){
    alert("setInterval invoked");
},1000);
// ajax就用jquery来模拟了
$.get("xxx.json",function(){
    alert("ajax finished");
});

while(true){
}

 

所以,javascript中的异步是通过单线程模拟的假异步,只不过看起来是异步而已。


测试方法本身有点儿问题,不太严谨。

回答3:

假设第一个函数是a
我们做AJAX的时候就是使用a
a函数的参数是b函数。
这里你要分清楚谁是回调函数。
实际上a是回调函数,b函数 你定义了对不对?但b函数是在a函数执行的时候才会执行的。

比较抽像。
具体假设ajax是个对象。假设已经取得为 ajax;
ajax.open();
ajax.onreadystatechange = function(){}

ajax.send();
这3个看到木有?
第二个是事件监听啊。
也就是监听了服务器的状态。这次请求的情况。
OK。
这个函数里面是什么呢?
if(ajax.status==4) {
处理。。。。。

}
看清楚没有了。回调函数其实是ajax.onreadystatechange 指向的这个函数。

回答4:

学习中,继续关注