【问题标题】:AJAX Promises using Array使用数组的 AJAX 承诺
【发布时间】:2013-10-06 00:10:11
【问题描述】:

我正在尝试使用 Promise 进行几次 AJAX 调用(比如说 2 次)。基本上我希望能够将两个响应合并在一起,对它们进行整体分析,然后吐出一个响应。 现在,我有:

var responseArray = [];
for (var i=0; i<letsSayTwo; i++) {
  responseArray.push(someAjaxCall(data));
};
responseArray.done(function(response) {
  var spit = someAnalysis(response);
  console.log(spit);
});
responseArray.fail(function(response) {
  console.log('fail');
});

就目前而言,我在控制台中收到“Uncaught TypeError: Object [object Array] has no method 'done'”错误。我认为我不能使用这种方法是正确的吗?我研究了使用 (http://gregfranko.com/blog/jquery-best-practices/) 中的以下代码,但我似乎无法获得所需的响应。

$.when.apply(this, responseArray).then(function(response) {
  console.log(response);
});

相反,我得到的是 [response, "success", response] 其中第一个响应是其中一个 AJAX 调用的正确返回响应,最后一个响应是实际调用本身。我应该如何从两个 AJAX 调用中获得正确的响应??

我希望这一切都有意义。谢谢!

【问题讨论】:

标签: javascript jquery ajax promise


【解决方案1】:

就目前而言,我在控制台中收到Uncaught TypeError: Object [object Array] has no method 'done' 错误。我认为我不能使用这种方法是否正确?

不是在数组上,是的。您只能在 Promise 和 Deferred 对象上调用此方法,例如 $.when.apply(this, responseArray) 生成的对象

……但我似乎无法得到我需要的回应。相反,我得到的是[response, "success", response],其中第一个响应是其中一个 AJAX 调用的正确返回响应,最后一个响应是实际调用本身。

正如docs for $.when 中所述,它使用多个参数解析结果承诺 - 当输入承诺本身确实产生多个值时(例如$.ajax),每个参数都是一个各个承诺解决方案的参数对象。您只使用response 获得其中的第一个,但回调中有responseArray.length (letsSayTwo) 参数。

我应该如何从两个 AJAX 调用中获得正确的响应?

您想从每个arguments 对象中提取第一项(响应数据),因此您可以使用map

$.when.apply(this, responseArray).done(function() {
  var responses = $.map(arguments, function(args) { return args[0]; }),
      spit = someAnalysis(responses);
  console.log(spit);
}).fail(function(jqXHR, textStatus, errorThrown) {
  console.log('fail: '+textStatus);
});

【讨论】:

  • 知道了!谢谢你解释得这么好。请注意,我认为第二行的最后一个字符应该是分号,而不是逗号。
  • 不,它应该:这使它成为multi var statement,同时声明spit
  • 当然哈哈。抱歉,我取出了 someAnalysis 行,它抛出了一个错误。谢谢!
猜你喜欢
  • 2020-02-10
  • 2018-02-22
  • 2016-07-24
  • 2014-05-09
  • 2017-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-06
相关资源
最近更新 更多