我正在使用 Google 的 Feed API 构建一种 RSS Feed 阅读器。经过反复试验,我已经能够通过 PHP 实例化到给定 RSS URL 的连接,并返回 JSON 对象。我遇到的问题是我试图验证数组中的多个 URL,但由于 AJAX 的异步特性以及通过 Google API 加载时间滞后,结果代码在验证完成之前触发。我已经尝试过类似的事情:强制同步,setTimeouts,调用验证的对象上的 .promise 等,但我没有得到任何地方。任何帮助都将不胜感激。
我的代码:
PHP
$feed = $_POST['feed'];
$url = "http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=&q=" . $feed;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_REFERER, www.mywebsiteurl.com);
$body = curl_exec($ch);
curl_close($ch);
echo $body;
此代码段成功创建了到给定提要 URL 的连接,并返回包含提要数据的 JSON 对象。我正在使用以下 AJAX 调用调用此外部 php 脚本:
Ajax :
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);
});
});
最佳答案
使用 $.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();
});
});
关于javascript - 导致问题的异步 url 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22079732/