javascript - Javascript Ajax 会导致死锁吗?

标签 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){
        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/

相关文章:

javascript - 正确更改 z-index 以堆叠 SVG

javascript - JSON 数据和 Ajax 调用的 URL

javascript - 网站不调用AJAX,不报错,以前这样做过

Java并发从多个线程写入单个文本文件?

python - 无法使用多重处理修改数据框

javascript - 如何替换 d3 力布局中的节点?

javascript - 如何检查多个相等语句?

java - 在 1 个类中运行 2 个以上线程

PHP 中的 JavaScript(wordpress)

ajax - 让浏览器在不提交(或根本没有)表单的情况下记住输入字段?