2014-10-31 33 views
0

我正在嘗試使用HEAD請求檢查已死的YouTube視頻,以檢查https://gdata.youtube.com/feeds/api/videos/<videoID>。 現在的事情是,這些是快速和所有的,但他們會失敗,403和404:在.each()中多個AJAX調用,即使發生多個錯誤,也要執行一些操作

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(= )所有,以.always.fail它的第一個錯誤之後登錄。

即使出現錯誤,所有請求都完成後,我該如何處理?

(最終這個代碼將運行作爲書籤,上reddit.com $.fn.jquery -> "2.1.1"


編輯:這似乎可以解釋爲什麼只記錄:

  • 如果所有延期被解決,執行done回調。
  • 如果一個的延期被拒絕,請執行fail回調。

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

編輯2:採用安裝在document並登錄在所有AJAX結束全局AJAX事件處理程序.ajaxStop()請求

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

編輯3:使用。總是()已被建議,但它不會爲我工作......它會在第一次錯誤後觸發。我在Chrome 38上,但是當我嘗試使用Firefox 33時,它按預期工作,在所有AJAX請求完成後(1 OK和4失敗,日誌4),日誌。這是一個錯誤?

回答

0

您只在最後一次調用時指定一個succes函數。

嘗試

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

當然失效可以通過過程中途發生的呢?按照Andy的說法,用'always'代替'then'。 – 2014-10-31 09:37:05

+0

的確......總是比較安全的! – Bosken85 2014-10-31 10:19:43

相關問題