承诺解决后无法获得JSON响应

时间:2016-01-05 20:01:17

标签: jquery json ajax

对不起,你们。我真的不想问这个问题;我保证,我已经经历了许多其他问题,这些问题看起来甚至与我的耐心允许相关。

遵循以下问题的代码:

我有以下内容:

var XHR = [];

//This parses some selections on a screen, which, in turn, informs the URL inside the loop.
$("#list > input:checkbox:checked").each(function(){
    result = [];
    var list = $(this).val();
    XHR.push($.ajax({
        type:'GET',
        url:"https://a-place.com/subsite/webapp/_api/web/lists/getByTitle('"+list+"')/items?$select=" + select + "&$filter=" + filter + "&$expand=" + expand + "&$top=10000",
        dataType: "json",
        headers: {Accept:"application/json;odata=verbose"},
        complete:function(data){}
    }));
});

$.when(XHR).then(function(data){
    console.log(data);
});

无论我做什么,我都只是在那里得到承诺。然后施工。我无法对它们做任何事情,试图访问responseJSON属性,其中所有实际对象都没有做任何事情。我已经尝试在完整的回调函数中添加一个return语句,这似乎不会改变实际被推入XHR数组的内容。

理想情况下,这应该从一个或多个与所选选项匹配的SharePoint列表中返回一堆列表项,并将匹配的项放入我可以处理的单个数组中。

修改

嗯。好的,根据建议,我试过了:

success:function(data){}

success:function(data){return data.d.results;}

无论我使用$ .when.then还是.done,控制台都没有真正改变。

提前致谢。

3 个答案:

答案 0 :(得分:1)

您可以尝试在成功回调中收集所有结果,然后在'然后'中使用它。函数回调:

var results = [];
...
success: function(data){
    results.push(data.d.results);
}
...
$.when(XHR).then(function(){
   // Here you should have all results filled in
   console.log(results);
});

答案 1 :(得分:0)

您对$.when的使用不正确。 $.when未实现Promise.all,而是需要多个参数。幸运的是,这很容易解决。

$.when.apply($, XHR).then(...

答案 2 :(得分:-1)

您需要设置成功回调,而不是使用完整回调。 docs表示成功回调有一个数据参数,并且在成功和错误回调之后执行完整的回调。

我的代码中的示例:(使用json数据调用ApplyUpdate函数,然后将其应用于现有对象)

    function doRefresh(repeat) {
    if (nextTimeOut) clearTimeout(nextTimeOut);
    j$.ajax({
        type: "POST",
        contentType: "application/json; charset=utf-8",
        url: baseUrl + "/WebService/Service.asmx/GetSummary",
        data: "{}",
        dataType: "json",
        success: function (json) { ApplyUpdate(json.d, repeat); }
    });
}

function ApplyUpdate(resp, repeat) {
    goodObj.text(resp.GoodCount);
    errObj.text(resp.BadCount);
    if (repeat) nextTimeOut = setTimeout(autoRefresh, waitTime);
}