使用Array的AJAX Promises

时间:2013-09-30 07:46:36

标签: javascript jquery ajax promise

我试图使用promises进行几次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');
});

按照目前的情况,我得到一个&#34;未捕获的TypeError:对象[对象数组]没有方法&#39;完成&#39;&#34;&#34;控制台错误。我是否认为我不能使用这种方法?我研究了使用(http://gregfranko.com/blog/jquery-best-practices/)中的以下代码,但我似乎无法得到我需要的响应。

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

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

我希望这一切都有道理。谢谢!

1 个答案:

答案 0 :(得分:2)

  

目前,我在控制台中遇到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.lengthletsSayTwo个)参数。

  

我应如何从两个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);
});