【问题标题】:What is the best pattern for checking completion of jquery promises in JSON objects?在 JSON 对象中检查 jquery 承诺是否完成的最佳模式是什么?
【发布时间】:2016-11-13 22:30:27
【问题描述】:

我有一个数字列表,我想创建一个 JSON 对象数组,这些对象是通过从 api 查询数字而创建的。例如,如果数字是

numbers = [1, 4];

然后我想要一个像这样创建的 JSON 对象:

[{
  number: 1,
  data: $.getJSON('/api/numbers/1')
},
{
  number: 4,
  data: $.getJSON('/api/numbers/4')
}]

我认为最简单的方法是将数字列表映射到相应的 JSON 对象:

numbers_data = numbers.map(n => {number: n, data: $.getJSON('/api/numbers'+ n)})

但是,一旦我拥有带有嵌入式 $.getJSON 承诺的 numbers_data,我不确定如何判断所有 api 调用何时完成。是否有一种模式可以让我判断变量 numbers_data 何时完全解析,以便我可以对其进行处理?

【问题讨论】:

  • 您可以$.when 将承诺“组合”成一个,然后附加一个回调以了解一切何时完成。
  • 最后,你希望你的对象包含 promise 还是 AJAX 调用返回的 JSON 数据?]
  • 我希望对象包含返回的数据。是的,这就是我使用 $.when 的内容,但我觉得它太复杂了:promises = numbers.map(function(n){ return ($.getJSON('numbers/'+n)); }) datasets = numbers.map(function(n){ return {number: n, data: null}; }); $.when(promises).then(data) { for(var i=0; i
  • 如果 jqueries 的 promise 是 'thenable' 你可以使用 ES6 Promise.all。

标签: jquery json promise getjson


【解决方案1】:

您可以使用$.when 基本上将这些承诺“组合”成一个。然后,您可以将.done() 处理程序附加到$.when 的输出,并在完成所有 AJAX 调用后知道。然后,您可以访问所有返回的 JSON 数据并根据需要使用它/构建您的对象。

类似这样的:

var promises = [],
    numbers_data = numbers.map(number => {
        var data = $.getJSON('/api/numbers'+number);

        promises.push(data);
        return {number, data};
    });

// This will let you know once *all* promises are resolved.
$.when.apply($, promises).done(() => {
    // Each argument is an array with the following structure: [ data, statusText, jqXHR ]
    for(var i = 0, len = arguments.length; i < len; i++){
        numbers_data[i].data = arguments[i][0];
    }
});

【讨论】:

  • 这就是我最初的解决方案,我只是想知道是否有更实用的方法来做到这一点。尽管最终这可能最终成为最简单的解决方案。
  • @Daniel “我只是想知道是否有更实用的方法”“更实用”是什么意思?
  • 现在更简洁地将 $.when.apply() 替换为 Promise.all()。结果then() 是只有响应数据的真实数组
猜你喜欢
  • 2014-11-24
  • 2017-12-18
  • 2011-03-20
  • 2020-11-06
  • 1970-01-01
  • 2010-11-15
  • 1970-01-01
  • 2011-09-18
  • 1970-01-01
相关资源
最近更新 更多