js有没有可能一个函数执行到一半的时候执行另一个函数?



  $.ajax({
        type: "GET",
        url: "www.xxx.com/xxx.php",
        data: {username:123},
        dataType: "json",
        success: function(data){
            //假如执行到这里的时候,ajax加载完成了,
            //这时候是要等到myFun执行完了才执行success方法,还是两个方法同时执行?
        }
 });

function myFun(){
    var a = 1;
    a ++;
    a ++;
    
    //有没有可能执行到这里的时候同时执行success里的代码.
    //假如执行到这里的时候,ajax加载完成了,这时候是要等到myFun执行完了
    //才执行success方法,还是两个方法同时执行?
    a ++;
    a ++;
}

如上代码所示,假如myFun()这个函数正在执行的时候,ajax数据加载成功了,这时候是要等myFun执行完了再去执行success()方法,还是两个同时执行?

阅读 4.3k
5 个回答

你就想象一下,js是要执行一个语句的队列,ajax加载成功了,他的回调函数是要插入到队列的最后面的,所以要等引擎执行到他那才会执行。

js是单线程的。肯定是先执行myFun呗

ajax设置了同步就按顺序执行,设置为异步就两个一起执行

写了个例子

$.ajax("//jsfiddle.net/echo/json/?delay=2").fail(()=>console.log(`Ajax Done: ${new Date().toISOString()}`))
function myFunc(){
  var now = Date.now();
  console.log(`myFunc start: ${new Date().toISOString()}`);
  //setTimeout(function(){
  while(Date.now() - now < 5000){
    // do nothing...
  }
  console.log(`myFunc done: ${new Date().toISOString()}`);
  //  }, 100);
}

myFunc();

使用了jsfiddle的一个API,因为跨域,所以最后会出错,但是延迟的时间是对的,所以就用fail将就一下吧...
使用while来模拟js耗时程序
结果是,ajax先执行,毕竟是在myFunc前面;但是myFunc先结束,而且ajax的输出实际上等了5秒,也就是说那个while把ajax的回调block了

你需要了解下 什么叫event loop
js有没有可能一个函数执行到一半的时候执行另一个函数?当然可能
myFun可能也有异步的部分,或者还可能是个generator函数。

推荐问题