Javascript异步成功函数-互斥

Javascript Asynchronous success function - mutex

本文关键字:互斥 函数 成功 异步 Javascript      更新时间:2023-09-26

考虑以下情况:

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

    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 Workers,但这不是我们在这里讨论的内容)。

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

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

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

您也可以只使用带有延迟的JQuery的"when()"方法。

或者,Undercore的"after()"函数。

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

javascript中永远不会出现这样的比赛条件。javascript中有一个叫做Run to Completion的东西,它确保如果一个代码正在执行,它会在任何其他(异步)代码运行之前完全执行,因此不会出现并发问题。

有关更多详细信息,请参阅javascript中为什么没有并发控制工具。