Javascript Ajax会导致死锁吗?

Javascript Ajax会导致死锁吗?,javascript,ajax,multithreading,deadlock,Javascript,Ajax,Multithreading,Deadlock,我有一个思想实验。在我的代码中有一个全局变量,比如var changeMe并且我很少调用Ajax //call One -- third param is the callback function ajaxFunction(url1, params,function(data){ changeMe = data; }); //call Two ajaxFunction(url2, params,function(data){ chan

我有一个思想实验。在我的代码中有一个全局变量,比如
var changeMe并且我很少调用Ajax

 //call One -- third param is the callback function
    ajaxFunction(url1, params,function(data){
        changeMe = data;
    });

//call Two
    ajaxFunction(url2, params,function(data){
        changeMe = data;
    });
因此,
changeMe
值将取决于哪个Ajax调用最后完成,这意味着最后完成的调用将覆盖该值

如果两个调用都在同一时间、同一时间戳完成,该怎么办

由于Javascript是单线程的,我们通常不会遇到这个问题,但是在
setTimeout
和Ajax调用的情况下可能会出现这个问题。我不知道如何精确地复制这个问题,所以它仍然是一个思想实验

那么在多线程条件下如何处理死锁呢

我更喜欢像
changeMe
这样的答案是
url1
url2
,并给出清晰的情况说明


提前感谢

Javascript有一个事件队列。这意味着它将逐个处理所有事件(用户触发事件、setTimeout事件、ajax返回事件)

您不能对执行顺序进行假设,这绝对不是正确的方法。这并不意味着您不能进行同步。例如:

function processURLs() {
    var url1 = "http://www.url1.com/";
    var url2 = "http://www.url2.com/";
    var data1 = null;
    var data2 = null;

    ajaxFunction(url1, params, function(data){
        data1 = data;
        if( data2 !== null ) {
            process(data1, data2);
        }
    });

    ajaxFunction(url2, params, function(data){
        data2 = data;
        if( data1 !== null ) {
            process(data1, data2);
        } 
    });
}
你说过javascript是单线程的。这是正确的。该线程保持循环,并在有事件要处理时从该队列中弹出事件

即使调用完全在同一时间和同一时间戳完成,也会有一个事件队列排在另一个事件队列之前(因为您的系统将以某种顺序将消息传输到javascript进程)

如果您想知道javascript计时器如何使用该事件队列,我强烈建议您阅读

如果您想了解有关如何将网络事件传递到浏览器(javascript)的更多信息,您应该了解

例如,您的浏览器位于OSI第7层(应用程序),但网络事件的顺序将在下面决定(第3层到第6层)


因此,总结一下答案:没有人能告诉你changeMe将是url1或url2Javascript不会决定这里的顺序,它将在更深层次上决定(您的网卡、操作系统等)。

在Javascript中,异步操作在后台运行,但所有Javascript代码(包括回调)都在前台线程中运行。因此,从设计上讲,两个回调同时执行是不可能的

如果两个异步操作在完全相同的时间完成,则两者都将同时发出完成信号,然后Javascript调度程序将选择两个回调中的一个首先运行


哪个回调首先是实现和操作系统特定的,出于所有目的和目的,您可以假设它是随机的。

在JavaScript中,您只有一个线程,所以不会有问题。@Ishank…感谢fr tht..但我没有得到简单的ans fr这…javscript中维护了一个事件队列,下一个ajax将在上一个ajax完成时启动,但不会。即使两者(不知何故)在同一时刻完成交付,它们也将按顺序处理。Javascript从来都不是多线程的(除了最近引入的显式线程,但这些线程不能执行网络任务),在您的答案中包含一些可验证且有信誉的引用以支持您的声明将是非常好的。@SamuelLiew:如果您没有在每个答案上复制并粘贴它们,您的评论将是非常好的。除此之外,您还回答了问题。@Samuel:我已经添加了一个(wiki)链接,指向OSI模型的描述。它描述了您将在每次通信中经历的不同抽象层。然后,您可以阅读关于在哪一层决定的内容。添加了一个链接到Resig关于javascript定时器的博客文章。你还需要其他证明人吗?