繁体   English   中英

如何合并两个jQuery AJAX调用的结果并使用延迟/承诺

[英]How to merge results of two jQuery AJAX calls and use deferred/promise

我正在尝试合并两个jQuery AJAX调用的结果。 我在这里查看了其他类似的问题,但似乎没有一个帮助。 对于每个ajax调用(其中两个),我都成功调用了函数createStatusView,并将结果传递给它。 好的方面是,结果对于两个AJAX调用都有效。 坏消息是我的$ .when调用对res1和res2都返回未定义,然后将结果的未定义发送到我的createStatusView。 因此,我真的不想为两个AJAX调用(仅在$ .when时)都调用createStatusView。 任何建议将不胜感激。

function getSpecifiedList(listName, userId){

    var url = SP.PageContextInfo.get_webServerRelativeUrl() + "/_vti_bin/listdata.svc/" + listName;

    var url1 = url + "?$select=ParentOrg,ORG,URL,Site_Status&$inlinecount=allpages";       
    var call1 = $.ajax({
        url: url1,
        type: "GET",
        headers:{"accept":"application/json;odata=verbose",
        },
        success: function(results){createStatusView(results, listName);},
        error:function(error){
            console.log("Error in getting List: " + listName);
            $(_options.container).html("Error retrieving your " + listName + ". " + 
            SP.PageContextInfo.get_webServerRelativeUrl());
        }
    });

    var url2 = url + "?$select=ParentOrg,ORG,URL,Site_Status&$inlinecount=allpages&$skiptoken=1000";
    var call2 = $.ajax({
        url: url2,
        type: "GET",
        headers:{"accept":"application/json;odata=verbose",
        },
        success: function(results){createStatusView(results, listName);},
        error:function(error){
            console.log("Error in getting List: " + listName);
            $(_options.container).html("Error retrieving your " + listName + ". " + 
            SP.PageContextInfo.get_webServerRelativeUrl());
        }
    });
    //the res1 and res2 come back undefined
            //call1 and call2 are objects as shown in F12 debug
    $.when(call1,call2).done(function(res1,res2){
        var results = res1[0].d.results.concat(res2[0].d.results);
        createStatusView(results,listName);
    });
}

尝试在$ .when回调函数中添加一些对象检测。 它将使未定义的值不在列表中。

$.when(call1,call2).done(function(res1,res2){
    var results = res1[0].d.results.concat(res2[0].d.results);
    if (results) {
        createStatusView(results,listName);
    }
});

另一个例子:

$.when(call1,call2).done(function(res1,res2){
   if (!res1 && !res2) return;
   var results = res1[0].d.results.concat(res2[0].d.results);
   if (results) {
      createStatusView(results,listName);
   }
});

与此相同:

$.when(call1,call2).done(function(res1,res2){
   if (res1 && res2) {
      var results = res1[0].d.results.concat(res2[0].d.results);
      if (results) {
         createStatusView(results,listName);
      }
   }
});

您是否尝试过将ajax调用移至单独的函数,然后从when调用那些函数?

function getSpecifiedList(listName, userId){
    $.when(call1(listName),call2(listName)).then(function(res1,res2){
        var results = res1[0].d.results.concat(res2[0].d.results);
        createStatusView(results,listName);
    });
}

function call1(listName){   
    var url = SP.PageContextInfo.get_webServerRelativeUrl() + "/_vti_bin/listdata.svc/" + listName;
    var url1 = url + "?$select=ParentOrg,ORG,URL,Site_Status&$inlinecount=allpages";   

    return $.ajax({
        url: url1,
        type: "GET",
        headers:{
            "accept":"application/json;odata=verbose",
        }
    }); 
};

function call2(listName){
    var url = SP.PageContextInfo.get_webServerRelativeUrl() + "/_vti_bin/listdata.svc/" + listName;
    var url2 = url + "?$select=ParentOrg,ORG,URL,Site_Status&$inlinecount=allpages&$skiptoken=1000";
    return $.ajax({
        url: url2,
        type: "GET",
        headers:{
            "accept":"application/json;odata=verbose",
        }
    });
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM