Javascript不会更新用PHP编写的变量

时间:2015-11-11 14:03:00

标签: javascript php jquery ajax

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

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() {
});

<script>标记内。

1 个答案:

答案 0 :(得分:1)

我认为你关于JS调用所有函数而不等待第一个函数完成的想法是正确的方向。这称为“异步请求”。有关详细说明,请参阅How to return the response from an asynchronous call?

我们的想法是发送您的3个请求,然后等待所有请求完成,然后再检查squadron_counter变量的值(或您在success回调中更新的数据)。< / p>

然后,如果我的理解是正确的,你不知道如何实现这个等待?

由于您使用的是jQuery,因此实现非常简单。请注意,您的jQuery.ajax request会返回Deferred object。因此,只需保留由您发送的每个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/