我有个思想实验。在我的代码中,我有一个全局变量,比如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,以及清楚的情况解释。
提前感谢
发布于 2013-07-31 11:41:01
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 Model。
例如,您的浏览器位于OSI第7层(应用程序),但是网络事件的顺序将在下面决定(第3层到第6层)。
总之,答案是:没有人能告诉你changeMe将是url1或url2。Javascript不会决定这里的顺序,它将在更深层次的(您的网卡、操作系统等)中决定。
发布于 2013-08-04 06:26:11
在Javascript中,异步操作在后台运行,但是所有Javascript代码,包括回调,都在前台线程中运行。因此,通过设计,两个回调同时执行是不可能的。
如果两个异步操作在完全相同的时间内完成,那么Javascript调度程序将选择两个回调中的一个先运行。
哪个回调首先是特定于实现和操作系统的,对于所有的意图和目的,您都可以假设它是随机的。
https://stackoverflow.com/questions/16457930
复制相似问题