【问题标题】:Having trouble getting to the JSON response after promises resolve承诺解决后无法获取 JSON 响应
【发布时间】:2016-01-06 06:13:38
【问题描述】:

对不起,你们。我真的很讨厌不得不问这个问题;我保证,在我的耐心允许的范围内,我已经解决了尽可能多的其他看似无关紧要的问题。

按照以下问题的代码:

我有以下内容:

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

无论我做什么,我都只会在 .when.then 构造中得到承诺。我无法对它们做任何事情,试图访问所有实际对象所在的 responseJSON 属性,什么也不做。我尝试在完整的回调函数中添加一个 return 语句,这似乎并没有改变实际推送到 XHR 数组中的内容。

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

编辑

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

success:function(data){}

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

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

提前致谢。

【问题讨论】:

  • 想想也许你想要.done(...)而不是.then(...)
  • 感谢您的建议,但我已经尝试过了。完全相同的结果。
  • 不要在成功回调中返回结果,而是尝试将其推送到数组中。 result.push(data.d.results); 然后在“then”函数中你会知道你已经准备好了所有结果,你可以使用它进行操作。这里不是花哨的解决方案,但应该可以。
  • 太棒了,@Borys,成功了。我可以处理这个。你应该把它写下来作为答案,这样我就可以标记它。谢谢!

标签: jquery json ajax


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 感谢您的建议。我尝试将 .apply 链接到 $.when ,我得到的只是一个奇怪的数组,它按此顺序包括一个对象,该对象仅包含来自第一个 ajax 调用的数据、字符串“success”,然后是另一个 promise有我无法获取的数据。
    • data 应该是数组或对象的数组。
    • 就像我说的,'data' 最终是一个数组,其中包含一个对象,其中只有 一个 ajax 调用的数据、字符串“success”和一个 promise 对象.
    • 表示XHR 只有一个承诺,在这种情况下,您将获得一个包含响应、textStatus 和 jqXHR 的数组。
    【解决方案3】:

    您需要设置 success 回调,而不是使用 complete 回调。 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);
    }
    

    【讨论】:

    • 似乎没有任何改变。我在上面编辑了我的问题。
    猜你喜欢
    • 1970-01-01
    • 2014-01-25
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 2018-11-14
    • 2016-04-05
    • 1970-01-01
    • 2020-08-12
    相关资源
    最近更新 更多