等待ajax响应来填充对象

时间:2012-11-27 16:04:52

标签: javascript jquery ajax

我正在使用AJAX从服务器获取一些值,而我正在异步地执行它。我怎么能停止以某种方式等待AJAX​​请求结束?这是我的代码:

var response = {}
for (var i = 0; i < length; i++){
        $.ajax({
            url : url[i],
            dataType : 'json'
        }).success(function(result) {
            processResult(result);
        })
}

我想我应该创建一个等待的函数,但它无法正常工作:

function wait() {
    for (var name in response) {
        if (response[name] === undefined) {
            setTimeout(function() {
                wait()
            },50)
        }
    }
    processResult(); //this is function where I will process my AJAX result
}

任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:1)

因为它可能就是答案,我会在这里发布。我想你正在寻找:

http://api.jquery.com/ajaxComplete/

您可以使用它来查明所有ajax何时完成,然后对响应执行某些操作。

答案 1 :(得分:1)

好的,我明白了。因为ajaxComplete是在每个单个AJAX请求之后启动的,正如我之前所说的,我必须创建将等待所有请求完成的函数。所以我这样做了:

我改变了我的功能:

var response = {}
for (var i = 0; i < length; i++){
        $.ajax({
            url : url[i],
            dataType : 'json'
        }).success(function(result) {
            processResult(result);
        })
}

为:

    response = {}
    for (var i = 0; i < length; i++){
      callAJAX(url[i]);
    }
_wait4ajax();

函数callAJAX是这样的:

function callAJAX(url){
            $.ajax({
                url : url[i],
                dataType : 'json'
            }).success(function(result) {
                processResult(result);
            })
}

_wait4ajax是我检查对象的所有属性是否都不是undefined的函数,所以: (我有应该在对象中填充的属性列表 - 此属性位于visibleLayers数组

function _wait4ajax(){
        var controlArray = [], self = this;

        var length = this.visibleLayers.length;
        for (var i = 0; i < length; i++) {
            if (this.cachedFeatures[this.visibleLayers[i]] === undefined) {
                controlArray.push('false');
            } else {
                controlArray.push('true');
            }
        }
        if (controlArray.indexOf('false') != -1) {
            setTimeout(function() {
                self._wait4ajaxComplete();
            }, 50);
        } else {
            //AJAX has ended - Object is ready
        }
}

我用我的项目中的实际代码搞砸了我的伪代码(为此网站目的而创建),所以它可能不会以这种形式工作,但我想指定这个主题的具体想法。随意编辑这篇文章。 :)

答案 2 :(得分:0)

这个问题的答案可以满足您的需求:

How can I get jQuery to perform a synchronous, rather than asynchronous, Ajax request?

您的代码:

var response = {}
for (var i = 0; i < length; i++){
        $.ajax({
            url : url[i],
            dataType : 'json',
            async:   false,
            success: function(result) {                
                processResult(result);
            }
}