[英]Break from jquery for loop when doing an ajax call return error
看看下面的代碼。 問題很簡單,如果方法findUserInfo ajax代碼返回錯誤,如何從這個for循環中斷。 總之,我怎么能隨時打破這個for循環呢? 是因為ajax調用是異步的嗎?
jQuery.each(d, function() {
findUserInfo(this);
});
function findUserInfo(userID){
var req = $.ajax({
url: "http://twitter.com/users/show.json?suppress_response_codes&id=xx!5@x!!x",
dataType : "jsonp"
});
req.success(function(msg) {
console.log('Yes! Success!');
});
req.error(function(msg) {
console.log('Error');
});
}
是的,jQuery.ajax是異步的,所以你需要使用類似的東西:
function findUserInfos(datas){
var userID=datas.shift(); //remove and return the first element
var req = $.ajax({
url: "http://twitter.com/users/show.json?suppress_response_codes&id=xx!5@x!!x",
dataType : "jsonp"
});
req.success(function(msg) {
console.log('Yes! Success!');
findUserInfos(datas)
});
req.error(function(msg) {
console.log('Error');
});
}
findUserInfos(d);
一旦出現錯誤,它就會破裂,因為我們只會繼續取得成功。
設置async:false是一個糟糕的主意。 它會導致瀏覽器在進行ajax調用時掛起。 Frame.js旨在解決這樣的問題:
jQuery.each(d, function() {
findUserInfo(this);
});
Frame.useTimeout = false; // turn off Frame's error recovery
function findUserInfo(userID){
Frame(function(next){
var req = $.ajax({
url: "http://twitter.com/users/show.json?suppress_response_codes&id=xx!5@x!!x",
dataType : "jsonp"
});
req.success(function(msg) {
console.log('Yes! Success!');
next();
});
req.error(function(msg) {
console.log('Error');
// don't call next and Frame will stop
});
});
}
Frame.init();
要從循環中斷開,返回false
如果在錯誤處理程序中拋出錯誤:
throw 'Error: ' + userID;
然后你可以寫
jQuery.each(d, function() {
try {
findUserInfo(this);
} catch(err) {
return false;
}
});
編輯:正如其他人評論的那樣,最好從成功處理程序返回true,從錯誤1返回false,然后調用return findUserInfo(this); 在循環內。 當然,如果您同步進行ajax調用,則可能會凍結瀏覽器。
如何將所有ID存儲為數組,將它們傳輸到服務器然后檢查給定結果!? 這節省了很多請求。 您可以將ID作為數組收集並通過POST ["id1","id2",...].join(",")
傳輸它們["id1","id2",...].join(",")
或者您提前獲取所有內容並在獲取后開始循環...
由於你已經說過的異步性質,不可能打破循環... async:false; 也可以提供幫助,但它會阻止UI更新(由於許多請求會導致瀏覽器忙碌)
你可以通過為ajax調用設置async:false來使ajax調用同步。 您已經具有錯誤功能來捕獲所有異常。 所以我相信應該這樣做
$.ajax({
type: "GET",
url: "/abc/GetNodesById",
contentType: "application/json; charset=utf-8",
dataType: "json",
data: { "nodeId": '' },
async: false,
cache: false,
success: function (data) {
//Do Work
}
error : function(jqXHR, textStatus, errorThrown){
// Handle Error
// Return False
}
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.