我需要发送$ .ajax请求并检查响应HTML以查看它是否包含某些文本。如果它确实存在,我想执行一个单独的函数并打破当前循环,因此它不会继续请求其他项。
我知道我无法打破成功函数中的循环,因为它在自己的范围内。任何解决方案都会很棒。
for(var i in list) {
var item = list[i];
$.ajax({
type: 'POST',
url: baseURL + '/ChangeItems/CheckAvailability',
data: { 'newitem': item, 'purchaseItem': false },
error: function(jqXHR, textStatus) { alert(textStatus); },
dataType: 'text',
success: function(data) { if(checkItem(data)) { buyItem(); break; } }
});
}
答案 0 :(得分:1)
我没有测试过这段代码,但我认为这是一个想法,它应该可行。
var list = [...], i = 0;
function myAjaxRequest(i)
{
var item = list[i];
$.ajax({
...
success: function(data)
{
if( checkItem(data) )
{
buyItem();
}
else if( typeof list[i+1] != "undefined" )
{
myAjaxRequest(i+1);
}
}
//, error: function(){ if( typeof list[i+1] != "undefined" ) myAjaxRequest(); }
});
}
myAjaxRequest(i);
答案 1 :(得分:0)
你可以让它同步并在$ .ajax之外进行处理:
for(var i in list) {
var item = list[i];
var result;
$.ajax({
type: 'POST',
url: baseURL + '/ChangeItems/CheckAvailability',
data: { 'newitem': item, 'purchaseItem': false },
error: function(jqXHR, textStatus) { alert(textStatus); },
dataType: 'text',
async: false,
success: function(data) { result = data; }
});
if(checkItem(result)) { buyItem(); break; }
}
答案 2 :(得分:0)
测试一下,我遇到了这个问题,我现在就解决了:
$break=0;
for(var i in list) {
if ($break) { break; }
var item = list[i];
$.ajax({
type: 'POST',
url: baseURL + '/ChangeItems/CheckAvailability',
data: { 'newitem': item, 'purchaseItem': false },
error: function(jqXHR, textStatus) { alert(textStatus); },
dataType: 'text',
success: function(data) { if(checkItem(data)) { buyItem(); $break = 1; } }
});
}
无法打破ajax响应中的循环。
答案 3 :(得分:-1)
您可以将异步请求中的每个xhr对象存储在一个数组中,并在其中一个成功完成后取消所有以下请求。
var xhrList = [];
var xhr = $.ajax({
type: 'POST',
url: baseURL + '/ChangeItems/CheckAvailability',
data: { 'newitem': item, 'purchaseItem': false },
error: function(jqXHR, textStatus) { alert(textStatus); },
dataType: 'text',
async: false,
success: function(data) {
for(var i = 0; i < xhrList.length; i++){
xhrList[i].abort();
}
}
});
xhrList.push(xhr);