javascript - 导致问题的异步 url 验证

标签 javascript php jquery ajax rss

我正在使用 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/

相关文章:

javascript - dijit.form.ComboBox 无法与 dojox.data.JsonRestStore 一起使用

php - 未知 : Failed opening required on line 0. laravel 5.6

jquery - 如何从 div 内容中删除特定的 div 并将其发送以进行保存?

jquery - 由于 Bootstrap 代码,无法隐藏很长的菜单项

javascript - 如何保持附加数据刷新?

javascript - Angular JS-尝试创建视频选择器 "angular way"

javascript - Zingchart最后一个元素一直在变颜色,与图例不匹配

php - Symfony 表单集合不保存引用

javascript - meteor 是否会在生产环境中缩小 client/compatibility 目录中的文件?

php - 插入中可捕获的 fatal error