Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript异步成功函数-互斥_Javascript_Ajax_Mutex - Fatal编程技术网

Javascript异步成功函数-互斥

Javascript异步成功函数-互斥,javascript,ajax,mutex,Javascript,Ajax,Mutex,考虑以下情况: 为了在后端处理大量工作,我将数据发送到接口并等待结果数据返回。因此,ajax调用是完美的。因为不知道结果是以什么顺序接收的,并且我需要在显示anthing之前以特定的顺序接收结果,所以只有在所有发送的任务都正确返回的情况下,我才会调用一个函数。这可以通过一个简单的(减少的,不完全是)信号量变量来完成,该变量统计发送了多少任务 var tasks = 0; do { // things to prepare tasks++; $.post

考虑以下情况:

为了在后端处理大量工作,我将数据发送到接口并等待结果数据返回。因此,ajax调用是完美的。因为不知道结果是以什么顺序接收的,并且我需要在显示anthing之前以特定的顺序接收结果,所以只有在所有发送的任务都正确返回的情况下,我才会调用一个函数。这可以通过一个简单的(减少的,不完全是)信号量变量来完成,该变量统计发送了多少任务

    var tasks = 0;

    do {
    // things to prepare
    tasks++;

    $.post("foo.php",data, function(data) {
    tasks--;
    foo(data); 
});

    }while(thereIsMore);

    foo(data) {

    // push data to array
    // sort the array

    if(tasks == 0)
     processResults(array);

    }
Javascript被称为单任务,而不是多任务。 我说的对吗?在访问阵列和任务计数器时不能存在互斥,因为这永远不会发生? 我对异步行为有点困惑,可能会想到一些场景,在这些场景中可以给出赛车情况

举个例子(我的理解是):

在很短的时间内发送和接收的3项任务。 因此,所有响应都在一种调度类型中处理。 任务1已检查(如果任务==0),结果为false。任务2在检查任务之前暂停一条指令,任务3现在作为成功处理程序执行。任务3现在递减任务,其值为0。任务3暂停,任务2继续。任务2检查(任务==0)是否正确,以及。。它是零。它开始处理,但并非所有数据都在数组中并已排序


我对你的观点或知识非常感兴趣,如果这完全是疯狂的,那是不可能发生的。请分享您的知识:-)

一次只能运行一个ajax响应函数,它将在下一个函数运行之前运行到完成。您不必担心同时访问javascript变量——这是不可能的。浏览器中的Javascript实际上是单线程的(除了Web工作人员,但这不是我们在这里讨论的内容)

Javascript使用事件队列。当异步操作(如ajax调用)完成时,它会将一个条目放入事件队列中。如果当前没有执行javascript,则立即触发该事件(并调用ajax回调)。如果某个javascript当前正在执行,它将继续执行。当javascript完成一个执行线程时,它会检查事件队列中是否还有其他东西在等待。如果有,它将处理该事件。这与鼠标事件、键盘事件、计时器事件、ajax完成事件等相同。。。工作

仅当当前执行线程完成时,才会处理下一个事件


如果您想知道所有ajax调用何时完成,只需像示例代码中那样记录到目前为止完成了多少ajax调用。在每个完成函数中,更改完成计数并比较其值,以查看是否完成了所有操作。如果数字表明所有操作都已完成,则可以执行最终操作。如果它们还没有全部完成,那么您将存储数据,而不执行其他操作,因为最后一个成功处理程序将看到它们全部完成并启动您的最终操作。

您也可以延迟使用JQuery的“”方法

…或下划线的“”函数


这两种方法都提供了一种非常简单的方法来跟踪大量异步请求何时返回。

这种竞速情况在javascript中永远不会发生。javascript中有这样一个东西,它可以确保如果一个代码正在执行,它会在任何其他(异步)代码运行之前完全执行,因此不会出现并发问题


有关更多详细信息,请参阅。

您最后一次提及的内容正是我正在做的,并且它按预期工作。但是这个问题仍然很棘手,因为我无法真正发现或测试它是否像你解释的那样有效。@Stefan-我回答了你的问题了吗?或者你还需要知道更多吗?