Javascript没有';t更新用PHP编写的变量


Javascript doesn't update variables written with PHP

我有一个javascript函数,它调用AJAX,如下所示:

function addSquadronByID(id) {
        $.ajax
        ({
            type: "POST",
            url: "server/get_squadron.php",
            data: {
                'id': id,
                'counter': squadron_counter
            },
            cache: false,
            success: function (data) {
                squadron_counter++;
            },
            error: function () {
                alert("AJAX error.");
            }
        });
    }
}

document.ready之外,变量的初始化方式类似于var squadron_counter = 0;

当我在页面中调用它时,这个函数非常有效,但如果我尝试使用PHP在页面中编写它,就像这样:

        $list_squadrons = $DB->Execute($query);
        while(!$list_squadrons->EOF){
            $currentSquadron_id = $list_squadrons->fields["squadron_id"];
            $currentSquadron_number = $list_squadrons->fields["squadrons"];
            echo "addSquadronByID($currentSquadron_id);'n";
            $list_squadrons->MoveNext();
        }

函数将正确的调用写入到document.ready()中,但即使函数有效,squadron_counter也始终是zero。我唯一的想法是,它是这样工作的,因为javascript一次调用所有函数,并且不会等到完成第一个函数后再执行第二个函数,等等。但我该如何解决这个问题呢?

请求的HTML输出:

addSquadronByID(3, squadron_counter);
addSquadronByID(5, squadron_counter);
addSquadronByID(6, squadron_counter);

这被放入

$( document ).ready(function() {
});

在CCD_ 5标签内。

我认为JS调用所有函数而不等待第一个函数完成的想法是正确的。这被称为"异步请求"。请参阅如何从异步调用返回响应?详细说明。

这个想法是发送您的3个请求,然后等待所有请求完成,然后检查squadron_counter变量的值(或您在success回调中更新的任何数据)。

那么如果我的理解是正确的,你不知道该如何实现这个等待吗?

由于您使用的是jQuery,因此实现非常简单。首先请注意,您的jQuery.ajax请求返回一个Deferred对象。因此,只需保留由您发送的每个AJAX请求创建的Deferred对象的引用。然后,您可以使用例如jQuery.when及其then方法中的回调来等待所有请求完成:

function addSquadronByID(id) {
    return jQuery.ajax({ /* ... */ }); // returns a Deferred object.
}
var d1 = addSquadronByID(3),
    d2 = addSquadronByID(5),
    d3 = addSquadronByID(6);
jQuery.when(d1, d2, d3).then(
    // callback executed on success of all passed Deferred objects.
    function () {
        console.log(squadron_counter);
    }
);

演示:http://jsfiddle.net/btjq7wuf/