我正在尝试使用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'); });
就目前而言,我在控制台中收到“未捕获的TypeError:对象[object Array]没有方法’done’”错误。我认为我不能使用此方法是否正确?我调查了以下来自(http://gregfranko.com/blog/jquery- best-practices/)的代码,但似乎无法获得所需的响应。
$.when.apply(this, responseArray).then(function(response) { console.log(response); });
相反,我得到的是[响应,“成功”,响应],其中第一个响应是一个AJAX调用的正确返回响应,最后一个响应是实际的调用本身。我应该如何从两个AJAX调用中获得正确的响应?
我希望这一切都有意义。谢谢!
就目前而言,我Uncaught TypeError: Object [object Array] has no method 'done'在控制台中遇到错误。我认为我不能使用此方法是否正确?
Uncaught TypeError: Object [object Array] has no method 'done'
不是在数组上,是的。您只能在Promise和Deferred对象上调用此方法,例如由$.when.apply(this, responseArray)
$.when.apply(this, responseArray)
…但是我似乎无法获得所需的回复。相反,我得到的是[response, "success", response]第一个响应是其中一个AJAX调用的正确返回响应,而最后一个响应是实际调用本身。
[response, "success", response]
如docs$.when中所述,它使用 多个参数 解析结果promise- 当输入promise本身确实产生多个值(例如,$.ajax确实)时,每个参数都是各自promise解析的参数对象。您只能使用来获得第一个参数,但是回调response有responseArray.length(letsSayTwo)个参数。
$.when
$.ajax
response
responseArray.length
letsSayTwo
我应该如何从两个AJAX调用中获得正确的响应?
您要从每个arguments对象中提取第一项(响应数据),因此可以使用map:
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); });