无法理解ajax调用

时间:2016-03-25 22:41:24

标签: javascript html ajax jquery-mobile rss

基本上我想要做的是从RSS源中抓取5张图像并在之后显示它们。不幸的是RSS项目没有链接到图像,所以我做的是从RSS提要中获取文章URL,然后我使用YQL扫描文章以查看是否有图像。文章可能有也可能没有图像,可能有10个或更多的文章,所以我必须有一个计数器来确定我何时获得5张图像。这就是我遇到问题的地方,我无法弄清楚如何在ajax调用的成功部分更新计数器(我也尝试过使用数组,但它没有'工作)。

我已经看过其他例子,我从昨天起就试图这样做,但我没有运气。也许有其他更简单的方法来做到这一点,但我不知道。任何帮助将不胜感激。

请参阅下面的代码。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>La Retama</title>
    <link rel="stylesheet" href="http://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css">
    <script src="http://code.jquery.com/jquery-1.11.3.min.js"></script>
    <script>
    $(document).bind('mobileinit',function(){
    $.mobile.changePage.defaults.changeHash = false;
    $.mobile.hashListeningEnabled = false;
    $.mobile.pushStateEnabled = false;
    });
    </script>
    <script src="http://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script>
    <link rel="stylesheet" href="./my_style.css"> 
</head>

<body>  
    <div id="home" data-role="page" >
        <div id="my_header" data-role="header">
            <h1>Insert Page Title Here</h1>
        </div>

        <div data-role="main" class="ui-content">

        </div>

        <div id="my_footer" data-role="footer" data-position="fixed">
            <h1>Insert Footer Text Here</h1>
        </div>
    </div> 
</body>

<script>
    var pagina7Arr = [];
    var pagina7SSPArr = [];

    /*Getting the RSS feed*/
    $.ajax({ 
        url: 'http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&callback=?&q=' + encodeURIComponent('http://web.paginasiete.bo/rss/feed.html?r=77'),
        dataType : 'jsonp',
        success  : function (data) {

            var myObject = data.responseData.feed.entries;
            var how_many = 0;

            for (var i=0; i < myObject.length;i++){

                var article_url = myObject[i].link;             
                var YQL_link = checkPagina7URL(article_url)     
                var YQL = "https://query.yahooapis.com/v1/public/yql?q=SELECT%20*%20FROM%20data.html.cssselect%20WHERE%20url%3D'"+YQL_link+"'%20AND%20(css%3D'.fotoNota-ext%20'%20OR%20css%3D'.fotoNota')&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys";
                pagina7Arr.push(YQL)
            }

            pageImages(pagina7Arr)

        }
    });

    /* Here is where I want to store the 5 images */
    function pageImages(input){

        var module = 0;
        var testarr=[];
        for (var i=0; i<input.length; i++){

            $.ajax({ 
                url: input[i],
                dataType : 'jsonp',
                success  : function (data) {

/*I would like to update a counter here or insert images to an array I can use later on*/
                    try{
                        testarr.push(data.query.results.results[0].div.img.src);
                    }catch(err){
                        try{
                            testarr.push(data.query.results.results[1].div.img.src);
                        }catch(err){

                        }
                    }
                }
            });

            console.log("array: "+testarr.length)
        }

    }

    /*Formatting the page URL to insert into YQL call*/

    function checkPagina7URL (data){
        data = data.substr(data.indexOf('.bo')+4,data.length);
        var section = data.substr(0, data.indexOf('/'));
        data = data.substr(data.indexOf('/')+1,data.length)

        var year = data.substr(0,data.indexOf('/'))
        data = data.substr(data.indexOf('/')+1,data.length);

        var month = data.substr(0,2);

        if(month.indexOf('/') != -1){
            month = data.substr(0,1);
        }else{
            month = data.substr(0,2);
        }
        data = data.substr(data.indexOf('/')+1,data.length);

        var day = data.substr(0,2);
        if(day.indexOf('/') != -1){
            day = data.substr(0,1);
        }else{
            day = data.substr(0,2);
        }
        data = data.substr(data.indexOf('/')+1,data.length);

        var page_link = data.substr(data.indexOf('/')+1,data.length);
        var result = "http%3A%2F%2Fwww.paginasiete.bo%2F"+section+"%2F"+year+"%2F"+month+"%2F"+day+"%2F"+page_link;

        return result;  
    }
</script>

</html>

1 个答案:

答案 0 :(得分:0)

当你进行$ .ajax({})调用时,异步调用成功。所以当你打电话给这一行时: console.log(&#34;数组:&#34; + testarr.length)

现在计算图像还为时过早,所以这里发生的是你正在调用所有页面,并为所有页面提取图像。你当然可以这样做,但是在你的计数器变为&gt; = 5之后你必须停止调用testarr.push。 (计数器检查应该在你进行这样的推送之前)

一种更有效的方法,就是只获取你需要的东西(虽然由于同步性而会慢一些),而只是在前一次调用的成功函数中进行后续的url调用。以上应该很容易做到。

你也可以做更多花哨的工作(虽然代码比较棘手),混合操作,获取5个url异步,然后在成功回调中看到你停止的5个图像,如果没有,make(5个计数器)异步请求剩下的页面网址。