jQuery with YQL RSS Feeds randomly returning null

跟風遠走 提交于 2019-12-12 02:49:21

问题


I'm using FeedEk plugin for jQuery which uses the YQL API, to try and display three RSS feeds.

Most of the time things are ok but every once in a while I will get a results: null from one of the three feeds, but usually the second and third ones to be called, very rarely the first. I have checked the feeds themselves and they are not showing any issues, I have also tested it on the Yahoo Console and it doesn't show an issue. It's not a call limit issue as I'm barely hitting 300 calls a day from my IP while testing.

I enabled diagnostics and the only thing I can see that is different with the result: null feed is it has the following message in the info section Using encoding from response content-type header (UTF-8) as XML document does not specify encoding.

Here is call that I'm making

SELECT channel.item FROM feednormalizer WHERE output="rss_2.0" AND url ="http://feeds.arstechnica.com/arstechnica/index" LIMIT 8

Here is the plugin code

/*
* FeedEk jQuery RSS/ATOM Feed Plugin v3.0 with YQL API (Engin KIZIL http://www.enginkizil.com)
* http://jquery-plugins.net/FeedEk/FeedEk.html  https://github.com/enginkizil/FeedEk
* Author : Engin KIZIL http://www.enginkizil.com
*/

(function ($) {
    $.fn.FeedEk = function (opt) {
        var def = $.extend({
            MaxCount: 5,
            ShowDesc: true,
            ShowPubDate: true,
            DescCharacterLimit: 0,
            TitleLinkTarget: "_blank",
            DateFormat: "",
            DateFormatLang:"en"
        }, opt);

        var id = $(this).attr("id"), i, s = "", dt;
        $("#" + id).empty();
        if (def.FeedUrl == undefined) return;
        $("#" + id).append('<div style="width:100%;text-align:center;color:#424242;"><div class="loader"></div></div>');

        var YQLstr = 'SELECT channel.item FROM feednormalizer WHERE output="rss_2.0" AND url ="' + def.FeedUrl + '" LIMIT ' + def.MaxCount;

        $.ajax({
            url: "https://query.yahooapis.com/v1/public/yql?q=" + encodeURIComponent(YQLstr) + "&format=json&diagnostics=true&callback=?",
            dataType: "json",
            success: function (data) {
                $("#" + id).empty();
                if (!(data.query.results.rss instanceof Array)) {
                    data.query.results.rss = [data.query.results.rss];
                }
                $.each(data.query.results.rss, function (e, itm) {
                    s += '<li><div class="itemTitle">' + itm.channel.item.title + '</div>';

                    if (def.ShowPubDate){
                        dt = new Date(itm.channel.item.pubDate);
                        s += '<div class="itemDate">';
                        if ($.trim(def.DateFormat).length > 0) {
                            try {
                                moment.lang(def.DateFormatLang);
                                s += moment(dt).format(def.DateFormat);
                            }
                            catch (e){s += dt.toLocaleDateString();}
                        }
                        else {
                            s += dt.toLocaleDateString();
                        }
                        s += '</div>';
                    }
                    if (def.ShowDesc) {
                        s += '<div class="itemContent">';
                         if (def.DescCharacterLimit > 0 && itm.channel.item.description.length > def.DescCharacterLimit) {
                            s += itm.channel.item.description.substring(0, def.DescCharacterLimit) + '...';
                        }
                        else {
                            s += itm.channel.item.description;
                         }
                         s += '</div>';
                    }
                });
                $("#" + id).append('<ul class="feedEkList">' + s + '</ul>');
            }
        });
    };
})(jQuery);

And finally the XML returned from YQL for the failed result

/**/
jQuery112204319277675822377_1459586267516({
    "query": {
        "count": 0,
        "created": "2016-04-02T08:37:48Z",
        "lang": "en-US",
        "diagnostics": {
            "publiclyCallable": "true",
            "url": {
                "execution-start-time": "1",
                "execution-stop-time": "59",
                "execution-time": "58",
                "content": "http://feeds.arstechnica.com/arstechnica/index"
            },
            "info": "Using encoding from response content-type header (UTF-8) as XML document does not specify encoding.",
            "user-time": "60",
            "service-time": "58",
            "build-version": "0.2.430"
        },
        "meta": {
            "url": {
                "id": "http://feeds.arstechnica.com/arstechnica/index",
                "status": "200",
                "headers": {
                    "header": [{
                        "name": "Content-Type",
                        "value": "text/xml; charset=UTF-8"
                    }, {
                        "name": "ETag",
                        "value": "m+oG6+UhrscSbLRLhGlL3lvlwNo"
                    }, {
                        "name": "Last-Modified",
                        "value": "Sat, 02 Apr 2016 07:32:51 GMT"
                    }, {
                        "name": "Content-Encoding",
                        "value": "gzip"
                    }, {
                        "name": "Expires",
                        "value": "Sat, 02 Apr 2016 07:40:36 GMT"
                    }, {
                        "name": "Cache-Control",
                        "value": "private, max-age=0"
                    }, {
                        "name": "X-Content-Type-Options",
                        "value": "nosniff"
                    }, {
                        "name": "X-XSS-Protection",
                        "value": "1; mode=block"
                    }, {
                        "name": "Server",
                        "value": "ATS"
                    }, {
                        "name": "Date",
                        "value": "Sat, 02 Apr 2016 08:37:48 GMT"
                    }, {
                        "name": "Age",
                        "value": "0"
                    }, {
                        "name": "Connection",
                        "value": "close"
                    }, {
                        "name": "Via",
                        "value": "http/1.1 ec2.ycs.bf1.yahoo.net (ApacheTrafficServer [cSsNfU])"
                    }
                    ]
                }
            }
        },
        "results": null
    }
});

回答1:


After doing some more experimentation that only solution I can come up with is that the YQL doesn't like feeds that take longer to be served. Slower and high demand feeds are the ones that seem to present this issue.

I have a feeling it might be because the API code has a timeout where the code the powers the Console doesn't and happily waits, hence why it works with one and not the other.

Unfortunately it would seem the only solution is to be careful with the feeds you use.



来源:https://stackoverflow.com/questions/36371105/jquery-with-yql-rss-feeds-randomly-returning-null

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!