gpt4 book ai didi

javascript - Javascript Ajax 会导致死锁吗?

转载 作者:可可西里 更新时间:2023-11-01 02:19:28 24 4
gpt4 key购买 nike

我有一个思想实验。在我的代码中,我有一个全局变量 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 这样的答案是 url1url2 ,以及一个清晰的情况解释..

提前致谢

最佳答案

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 不会在这里决定顺序,它会在更深层次决定(你的网卡,你的操作系统,等等)。

关于javascript - Javascript Ajax 会导致死锁吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16457930/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com