2013-05-09 68 views
11

我有一个思想实验。在我的代码中,我有一个全局变量,说var changeMe;,我正在做几个Ajax调用。Javascript 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的答案将是url1url2,以及明确的情况说明..

在此先感谢

+1

http://stackoverflow.com/questions/7575589/how-does-javascript-handle-ajax-responses-in-the-background/7575649#7575649 – 2013-05-09 08:58:35

+1

在JavaScript中,你只有一个线程,所以会有没问题。 – erikkallen 2013-05-09 09:04:31

+0

@Ishank ...感谢fr tht ..但我没有得到一个简单的答案fr这个... – Sarath 2013-05-09 09:59:49

回答

13

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的定时器是如何工作的与该事件队列中,我深深推荐的John Resig's blog post about it

阅读如果您想了解网络事件是如何传递给你的浏览器(JavaScript)的更多信息,您应该了解OSI Model。例如,您的浏览器位于OSI第7层(应用程序)中,但网络事件的顺序将在下面决定(第3层到第6层)。

那么总结一下答案:没有人能告诉你changeMe会是url1或url2。 Javascript不会决定这里的订单,它将在深层(您的网卡,您的操作系统等)中决定。

+1

这个答案听起来很不错,但是,包括一些在你的答案中可验证和有信誉的引用支持你的声明会很好。 – 2013-08-04 06:31:45

+1

@SamuelLiew:如果你没有复制并粘贴每一个答案,你的评论会很棒。 – 2013-08-05 18:28:59

+0

除此之外,http://stackoverflow.com/questions/7575589/how-does-javascript-handle-ajax-responses-in-the-background/7575649#7575649回答这个问题。 – 2013-08-05 18:29:28

5

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

如果两个异步操作在完全相同的时间完成,两者将同时表示它们的完成,然后Javascript调度器将选择两个回调中的一个首先运行。

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

+0

这个答案听起来很合理,但是,在您的答案中包括一些可验证的信誉参考以支持您的声明是非常好的。 – 2013-08-04 08:47:32