Javascript 导致问题的异步url验证
我正在使用Google的FeedAPI构建一种RSS提要阅读器。经过多次尝试和错误,我已经能够通过PHP实例化到给定RSS URL的连接,并返回JSON对象。我遇到的问题是,我试图验证一个数组中的多个URL,但由于AJAX的异步性质,以及通过Google API加载时间延迟,结果代码在验证完成之前就发出了。我曾经尝试过这样的事情:强制同步、设置超时、对调用验证的对象进行承诺,等等,但我却一无所获。任何帮助都将不胜感激 我的代码: PHP 此代码段成功创建到给定提要URL的连接,并返回包含提要数据的JSON对象。我通过以下AJAX调用调用此外部php脚本: 阿贾克斯:Javascript 导致问题的异步url验证,javascript,php,jquery,ajax,rss,Javascript,Php,Jquery,Ajax,Rss,我正在使用Google的FeedAPI构建一种RSS提要阅读器。经过多次尝试和错误,我已经能够通过PHP实例化到给定RSS URL的连接,并返回JSON对象。我遇到的问题是,我试图验证一个数组中的多个URL,但由于AJAX的异步性质,以及通过Google API加载时间延迟,结果代码在验证完成之前就发出了。我曾经尝试过这样的事情:强制同步、设置超时、对调用验证的对象进行承诺,等等,但我却一无所获。任何帮助都将不胜感激 我的代码: PHP 此代码段成功创建到给定提要URL的连接,并返回包含提要数据
var conn = $.ajax({
url : "php/feedlog.php",
type : "post",
data : {feed: feed_a[i]}
});
conn.done(function (data){
var err = eval('(' + data + ')' ).responseStatus;
if (err==200){
console.log("Success");
} else if (err==400){
console.log("Failure with: " + err);
}
});
这段代码可以完美地用于一次连接尝试,但是我需要线性地逐步完成一个提要数组,测试一个提要,等待连接结果,然后继续执行数组中的下一个提要,或者中断一个成功的连接
我尝试为feed_a[]使用$.each语句,但循环的启动速度比返回结果的速度快。我想我需要操作一个缓冲区,但我不知道如何实现它
一如既往,如果需要,我可以提供额外的代码,以前的尝试,或更大的澄清要求。如果需要,我可以在我的网站上为演示目的实时托管代码
更直接的问题:如何强制循环$.each、for循环或递归函数等待AJAX调用的结果 另外,为了让我的问题在将来变得更好,有人能解释一下为什么我的问题可能被记下来了吗 编辑:谢谢大家的快速回复!出现以下代码以解决我的问题:
$.each(v_feed, function(_,url){
$.ajax("php/feedlog.php",{
type: "POST",
data: { feed: url }
}).done(function(data){
var err = eval('(' + data + ')' ).responseStatus;
if (err == 200){
console.log("success with: " + data);
} else if (err == 400){
console.log("fail with: " + data);
console.log("removing from valid array");
v_feed.splice(v_feed.length - _, 1);
}
//console.log(err);
}).fail(function(){
console.log("Fail");
}).complete(function(){
console.log(v_feed);
});
});
试试看:
var arrayOfPromises = [];
//inside each/for loop, push request in array
arrayOfPromises.push($.ajax({
url : "php/feedlog.php",
type : "post",
data : {feed: feed_a[i]}
}));
然后在循环外:
$.when.apply($, arrayOfPromises).done(function(data){
//all requests are done
});
我记不清哪些数据将被传递到done,请检查它。尝试:
var arrayOfPromises = [];
//inside each/for loop, push request in array
arrayOfPromises.push($.ajax({
url : "php/feedlog.php",
type : "post",
data : {feed: feed_a[i]}
}));
然后在循环外:
$.when.apply($, arrayOfPromises).done(function(data){
//all requests are done
});
我记不清要将哪些数据传递给done,请检查它。只有在成功时才触发下一次呼叫:
var worked = {status:true},
conn = function(successLogic){
if(feed_a[i]) // I assume this is the loop end condition...
$.ajax({
url : "php/feedlog.php",
type : "post",
data : {feed: feed_a[i]},
success: function(data){
if(successLogic(data));
worked.status = worked.status && conn(successLogic); // Recursion instead of iteration!
},
error: function(err){
worked.status = false;
// your error code
}
});
else
return worked;
};
var completedRecusionPromise = conn(function(data){
var obj;
try{
obj = JSON.parse(data);
}catch(e){ console.log(e); }
return !!obj; // Assuming you just want valid JSON??
});
只有在成功时才触发下一个呼叫:
var worked = {status:true},
conn = function(successLogic){
if(feed_a[i]) // I assume this is the loop end condition...
$.ajax({
url : "php/feedlog.php",
type : "post",
data : {feed: feed_a[i]},
success: function(data){
if(successLogic(data));
worked.status = worked.status && conn(successLogic); // Recursion instead of iteration!
},
error: function(err){
worked.status = false;
// your error code
}
});
else
return worked;
};
var completedRecusionPromise = conn(function(data){
var obj;
try{
obj = JSON.parse(data);
}catch(e){ console.log(e); }
return !!obj; // Assuming you just want valid JSON??
});
循环使用$.each,在发送ajax请求之前为html中的每个提要创建包装,并存储对包装的引用。完成后,使用提要填充包装器。这将允许您一次检索它们,同时仍以正确的顺序将它们添加到页面中,而无需等待它们全部完成
$.each(feedArr, function(_,url){
var wrapper = $("<div>").appendTo(someel);
$.ajax("feed.php",{
type: "POST",
data: { url: url }
}).done(function(data){
// process data...
wrapper.append(generateFeedHTML(data));
}).fail(function(){
wrapper.remove();
});
});
循环使用$.each,在发送ajax请求之前为html中的每个提要创建包装,并存储对包装的引用。完成后,使用提要填充包装器。这将允许您一次检索它们,同时仍以正确的顺序将它们添加到页面中,而无需等待它们全部完成
$.each(feedArr, function(_,url){
var wrapper = $("<div>").appendTo(someel);
$.ajax("feed.php",{
type: "POST",
data: { url: url }
}).done(function(data){
// process data...
wrapper.append(generateFeedHTML(data));
}).fail(function(){
wrapper.remove();
});
});
如何强制循环$.each、for循环或递归函数等待AJAX调用的结果?你不能那样做。您使用相对回调/方法来请求和设置逻辑。您可以将延迟/承诺对象数组传递给$.when:$.when.apply$,arrayOfPromises@沃尔夫将能够提供一个基本的例子,或一个网站,这样做?恐怕我不完全理解您所说的相对回调/方法是什么意思。如何强制循环$。each、for循环或递归函数等待AJAX调用的结果?你不能那样做。您使用相对回调/方法来请求和设置逻辑。您可以将延迟/承诺对象数组传递给$.when:$.when.apply$,arrayOfPromises@沃尔夫将能够提供一个基本的例子,或一个网站,这样做?恐怕我不完全理解您所说的相对回调/方法是什么意思。每个ajax请求中的每一组参数都将作为每个参数的数组发送到done参数列表。例如,在代码中,数据将是[ParsedResponsetText,statusCode,jqXHR],表示第一个请求。最好的处理方法是像thingy一样循环参数数组。@KevinB一如既往,谢谢!你的答案更合适,我猜这似乎是我的问题的最佳解决方案,根据我的初步测试。它连接到每个url,返回JSON数据,验证状态代码,然后。当确保我可以忽略错误的连接,并继续对成功的提要进行内容验证时。非常感谢。什么时候我可以省略坏的连接不一定。如果其中任何一个失败,则不会触发“完成”回调。我建议让php总是返回200个成功,然后测试每个请求是否返回了任何内容,看看它是否失败,以确保它们都不会失败。GoogleFeedAPI总是返回一个状态码,因此php脚本只有在URL不正确时才能返回一个值。在wi中,使用上面列出的方法似乎更为一致
我可以从阵列中删除失败的连接,留下一个有效连接的阵列。我已经更新了我的问题。每个ajax请求中的每一组参数都将作为每个请求的数组发送到done参数列表。例如,在代码中,数据将是[ParsedResponsetText,statusCode,jqXHR],表示第一个请求。最好的处理方法是像thingy一样循环参数数组。@KevinB一如既往,谢谢!你的答案更合适,我猜这似乎是我的问题的最佳解决方案,根据我的初步测试。它连接到每个url,返回JSON数据,验证状态代码,然后。当确保我可以忽略错误的连接,并继续对成功的提要进行内容验证时。非常感谢。什么时候我可以省略坏的连接不一定。如果其中任何一个失败,则不会触发“完成”回调。我建议让php总是返回200个成功,然后测试每个请求是否返回了任何内容,看看它是否失败,以确保它们都不会失败。GoogleFeedAPI总是返回一个状态码,因此php脚本只有在URL不正确时才能返回一个值。使用上面列出的方法似乎可以在更广泛的场景中更一致地工作,并且我能够从阵列中删除失败的连接,留下一个有效连接阵列。我已经更新了我的问题。编辑为使用var外部闭包,仅在提要结束时返回,使用对象,所以它的承诺类似于状态编辑为使用var外部闭包,仅在提要结束时返回,使用对象,所以它的承诺类似于状态这实际上回答了一个我还没有遇到的问题,这对于我即将完成的显示内容的任务非常有用。幸运的是,在我的应用程序中,在选择有效的提要之前,结果不需要显示在页面上。非常感谢。我将在以后的任务中引用此评论。这实际上回答了一个我还没有遇到的问题,对于我即将完成的显示内容的任务非常有用。幸运的是,在我的应用程序中,在选择有效的提要之前,结果不需要显示在页面上。非常感谢。我将在以后的任务中引用此评论。