Jquery:当所有嵌套的 ajax 调用也都完成时调用函数

Jquery: Call then function when all nested ajax calls are also complete

提问人:Praveen Shakkarval 提问时间:10/1/2020 最后编辑:James ZPraveen Shakkarval 更新时间:10/1/2020 访问量:55

问:

我正在尝试在函数和时间的帮助下编写一些嵌套的ajax调用。但目前,我的 then 函数未按预期工作。我想在所有 Ajax 调用(包括嵌套调用)完成后调用函数。我想在以下情况下调用函数

this.getDescendants(resourceId[1],resourceData.limit+resourceData.offset); 

对于所有主要的 Ajax 调用也已完成。目前,在嵌套的 ajax 调用完成之前完成。

    getUserInfo: function(){
        $.ajax({
            type: "GET",
            contentType: "application/json",
            url: UserURL,
            context: this,
            beforeSend: function (xhr) {
              $('#fade-wrapper').fadeIn();
              xhr.setRequestHeader('Authorization', "Basic "+this._basicCred);
            },
            success: function(resourceData) {
                if(resourceData.resources != undefined && resourceData.resources.length > 0){
                    var deferreds = [];
                    for (var i=0; i < resourceData.resources.length; ++i){
                      var deferred = this.getDescendants(resourceData.resources[i],0);
                      deferreds.push(deferred);
                    }
                    $.when.apply($, deferreds).then(function() {
                        var currentContext = this[0];
                        console.log(currentContext);
                        console.log("Then called.");
                    });
                } else {
                    alert("No visible resource has been found.");
                }
            }.bind(this),
            error: function(xhr, status, err) {
                console.error( status, err.toString());
                $('#fade-wrapper').fadeOut();
                alert("Error has occurred, please contact administrator in case the problem persists.");
                return null;
            }.bind(this)
        });
        
    },
    getDescendants: function(resId,offset){
        return $.ajax({
            type: "GET",
            contentType: "application/json",
            data: {"resId":resId},
            url: DesedentURL+"?limit=10&offset="+offset,
            context: this,
            beforeSend: function (xhr) {
                xhr.setRequestHeader('Authorization', "Basic "+this._basicCred);
            },
            success: function(resourceData, textStatus, xhr) {
                if(this._resResults == undefined){
                    this._resResults = [];
                }
                this._resResults.push(resourceData);
                console.log("resourceData");
                console.log(resourceData);
                if(resourceData.totalResults > (resourceData.limit+resourceData.offset) ){
                    var resourceId = resourceData.links[0].href.match("resources/(.*)/descendants");
                    console.log(resourceId);
                    this.getDescendants(resourceId[1],resourceData.limit+resourceData.offset);
                }
            }.bind(this),
            error: function(xhr, status, err) {
                console.error( status, err.toString());
                $('#fade-wrapper').fadeOut();
                alert("Error has occurred, please contact administrator in case the problem persists.");
                return null;
            }.bind(this)
        });
    }
jquery ajax 嵌套 es6-promise .when

评论

0赞 Zmart 10/1/2020
您可能想了解更多关于 Promise 的信息。一种常见的模式是创建一个数组,然后将其传递给 Promise.all()
0赞 Praveen Shakkarval 10/1/2020
你好 Zmart,我试图复制同样的东西。但问题是,在我的ajax中,我必须根据响应处理一些额外的嵌套ajax调用。在额外的ajax调用中,我遇到了这个问题,因为我不知道所有额外的嵌套ajax调用何时完成。
0赞 Zmart 10/2/2020
将它们包装在一个 promise 中,并将 promise resolve() 放在 ajax 调用中?

答: 暂无答案