11

我有一个思想实验。在我的代码中,我有一个全局变量 sayvar 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;
    });

因此changeMevalue 将取决于最后完成的 Ajax 调用,这意味着最后完成的调用将覆盖 value。

如果两个调用完全在同一时间完成,相同的时间戳怎么办?

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

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

我更喜欢changeMewill be url1or之类的答案url2,以及清晰的情况解释。

提前致谢

4

2 回答 2

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 的博客文章

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

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

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

于 2013-07-31T11:41:01.020 回答
5

In Javascript asynchronous operations run in the background, but all Javascript code, including callbacks, run in the foreground thread. So it is really impossible by design that two callbacks will execute at the same time.

If the two asynchronous operations finish at the exact same time both will signal their completion at the same time, and then the Javascript scheduler will pick one of the two callbacks to run first.

Which callback goes first is implementation and operating system specific, for all intents and purposes you can assume it will be random.

于 2013-08-04T06:26:11.037 回答