簡體   English   中英

使用 Javascript 合並 JSON api 響應

[英]Merging JSON api Response using Javascript

我正在嘗試從 Topsy(http://code.google.com/p/otterapi/)獲取分頁 json 響應,並且在合並對象時遇到問題。 我想在瀏覽器中執行此操作,因為 api 速率限制是每個 ip/用戶,並且在服務器端做事低。

這是我的代碼。 有沒有更好的辦法? 當然有,因為這行不通。 我想我想讓這個工作,但也想了解是否有更安全和/或更有效的方法。

我得到的錯誤信息是......

類型錯誤:表達式“window.holdtweetslist.prototype”[未定義] 的結果不是 object。

提前致謝。

干杯斯蒂芬

    $("#gettweets").live('click', function(event){ 

        event.preventDefault();
        getTweets('stephenbaugh');

    });



    function getTweets(name) {

        var MAX_TWEETS = 500;
        var TWEETSPERPAGE = 50;
        var BASE = 'http://otter.topsy.com/search.json?type=tweet&perpage=' + TWEETSPERPAGE + '&window=a&nohidden=0&q=@' + name + '&page=1';

        var currentpage = 1;
            alert(BASE);

        $.ajax({
            dataType: "json", 
            url: BASE,
            success: function(data) {

                window.responcesreceived = 1;
                var response=data.response;
                alert(response.total);
                window.totalweets = response.total;

                window.pagestoget = Math.ceil(window.totalweets/window.TWEETSPERPAGE);

                window.holdtweetslist = response.list;

                window.holdtweetslist.prototype.Merge = (function (ob) {var o = this;var i = 0;for (var z in ob) {if (ob.hasOwnProperty(z)) {o[z] = ob[z];}}return o;});

        //  alert(data);
            ;;  gotTweets(data);

                var loopcounter = 1;
                do
                {
                    currentpage = currentpage + 1;
                    pausecomp(1500);
                    var BASE = 'http://otter.topsy.com/search.json?type=tweet&perpage=' + TWEETSPERPAGE + '&window=a&nohidden=0&q=@' + name + '&page=' + currentpage;
alert(BASE);
                    $.ajax({dataType: "json", url: BASE, success: gotTweets(data)});
                }
                while (currentpage<pagestoget);

            }
        });
    };

    function gotTweets(data)
    {
        window.responcesreceived = window.responcesreceived + 1;
        var response = data.response;
        alert(response.total);
        window.holdtweetslist.Merge(response.list);
        window.tweetsfound = window.tweetsfound + response.total;
        if (window.responcesreceived == window.pagestoget) {
            // sendforprocessingsendtweetlist();
            alert(window.tweetsfound);
        }
    }

您將Merge稱為 static 方法,但將其聲明為“實例”方法(對於prototype保留字)。

從 Merge 聲明中刪除prototype ,因此您將擁有:

window.holdtweetslist.Merge = (function(ob)...

這將修復 javascript 錯誤。

這是來自 Topsy 的 Vipul。 你會分享你收到的文字 JSON 嗎? 我想確保您沒有收到錯誤的回復。

感謝 Edgar 和 Vipul 的幫助。 不幸的是,他們能夠回答我的問題。 我已經設法解決問題是 jquery 沒有正確解析 json 並且需要使用 jsonp 和 topsy 的組合。

這是我創建的一個小測試。

創建一個帶有此 object 的文檔....

<a href="#" id="gettweets">RUN TEST</a>

您將需要 JQUERY

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script>

並將以下內容也放入腳本中。 這是循環通過來自 Topsy 的所需數量的推文。

再次感謝大家。

$("#gettweets").live('click', function(event){ 

    event.preventDefault();
    getTweets('stephenbaugh');

});


    var MAX_TWEETS = 500;
    var TWEETSPERPAGE = 50;
    var BASE = 'http://otter.topsy.com/search.json';
    var currentpage;
    var responcesreceived;
    var totalweets;
    var pagestoget;
    var totalweets;
    var TWEETSPERPAGE;
    var holdtweetslist = [];
    var requestssent;
    var responcesreceived;
    var tweetsfound;
    var nametoget;


function getTweets(name) {

    nametoget=name;
    currentpage = 1;
    responcesreceived = 0;
    pagestoget = 0;

    var BASE = 'http://otter.topsy.com/search.js?type=tweet&perpage=' + TWEETSPERPAGE + '&window=a&nohidden=0&q=@' + nametoget + '&page=1';
    $('#gettweets').html(BASE);
    $.ajax({url: BASE, 
    dataType: 'jsonp',
    success : function(data) {
            getalltweets(data);
        }
    });
};


function getalltweets(data) {

        totalweets = data.response.total;
        $('#gettweets').append('<p>'+"total tweets " + totalweets+'</p>');
        $('#gettweets').append('<p>'+"max tweets " + MAX_TWEETS+'</p>');
        if (MAX_TWEETS < totalweets) {
            totalweets = 500
        }
        $('#gettweets').append('<p>'+"new total tweets " + totalweets+'</p>');


        gotTweets(data);



        pagestoget = Math.ceil(totalweets/TWEETSPERPAGE);

        var getpagesint = self.setInterval(function() { 

            currentpage = ++currentpage;

            var BASE = 'http://otter.topsy.com/search.js?type=tweet&perpage=' + TWEETSPERPAGE + '&window=a&nohidden=0&q=@' + nametoget + '&page=' + currentpage;
            $.ajax({url: BASE, 
                dataType: 'jsonp',
                success : function(data) {
                    gotTweets(data);
                    }
            });
            if (currentpage == pagestoget) {
                $('#gettweets').append('<p>'+"finished sending " + currentpage+ ' of ' + pagestoget + '</p>');
                clearInterval(getpagesint);
            };

        }, 2000);
};


function gotTweets(data)
{

        responcesreceived = responcesreceived + 1;
        holdlist = data.response.list;

        for (x in holdlist)
        {
            holdtweetslist.push(holdlist[x]);
        }

    // var family = parents.concat(children);


        $('#gettweets').append('<p>receipt # ' + responcesreceived+' - is page : ' +data.response.page+ ' array length = ' + holdtweetslist.length +'</p>');
        //      holdtweetslist.Merge(response.list);
        tweetsfound = tweetsfound + data.response.total;
        if (responcesreceived == pagestoget) {
        // sendforprocessingsendtweetlist();
            $('#gettweets').append('<p>'+"finished receiving " + responcesreceived + ' of ' + pagestoget + '</p>');
        }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM