在.each()中进行多次AJAX调用,即使出现多个错误,也可以执行所有操作

时间:2014-10-31 09:31:37

标签: javascript jquery ajax youtube

我试图通过向https://gdata.youtube.com/feeds/api/videos/<videoID>的HEAD请求查看已死的YouTube视频。 现在问题是这些都是快速的,但它们将失败,403和404:

  

HEAD https://gdata.youtube.com/feeds/api/videos/XmQR4_hDtpY 404 (Not Found)

这些错误似乎搞得一团糟。

我找到Multiple ajax calls inside a each() function.. then do something once ALL of them are finished? - Stack Overflow并尝试使用this answer

var videoIDs = ['a9KvHnHQVTc', 'XmQR4_hDtpY', 'WelBUaf5qsw', 'Mcrt9LJkGT4', 'P9qTLa2DVR8'];
var calls = [];
var deadVids = [];

$.each(videoIDs, function(index, value) {
    calls.push($.ajax({
        type: "HEAD",
        url: "https://gdata.youtube.com/feeds/api/videos/" + value,
        error: function() {
            deadVids.push('https://www.youtube.com/watch?v=' + value + " is dead!");
        }
    }));
});

$.when.apply($, calls).always(function(){
     console.log(deadVids.length);
   });

使用.then时,它永远不会记录deadVids.length(= 4 ),.always.fail记录 1 < / strong>在第一次出错后。

一旦所有请求完成,即使有错误,我该怎么办?

(最终此代码将作为书签运行,在reddit.com $.fn.jquery -> "2.1.1"上)


编辑:这似乎解释了为什么它只记录 1

  • 如果所有已解决延迟,请执行done回调。
  • 如果拒绝一个延迟,请执行fail回调。

通过http://afgomez.es/blog/better-ajax-callbacks-with-jquery-promises/

编辑2:使用附加到.ajaxStop()的全局Ajax事件处理程序document会在所有AJAX请求结束时记录 4

$( document ).ajaxStop(function() {
  console.log(deadVid);
});

编辑3 :建议使用.always(),但它对我不起作用......它会在第一次错误后触发。我在Chrome 38上,但是当我尝试使用Firefox 33时,它按预期工作,在所有AJAX请求完成后记录(1 OK和4 failed,log 4)。这是一个错误吗?

1 个答案:

答案 0 :(得分:0)

您只在最后一次通话中指定成功功能。

$.when.apply($, calls).then(function() {
        console.log(deadVid);
}, function(){
  //log failed
});