使用Javascript合并JSON api响应

使用Javascript合并JSON api响应,javascript,jquery,json,api,Javascript,Jquery,Json,Api,我正在尝试从Topsy获取分页json响应(http://code.google.com/p/otterapi/)我在合并对象时遇到问题。我希望在浏览器中执行此操作,因为api速率限制为每个ip/用户,并且服务器端的待办事项率较低 这是我的密码。有更好的办法吗?当然有,因为这不起作用。我想我想让它工作,但也要了解是否有更安全和/或更有效的方法 我收到的错误消息是 TypeError:表达式“window.holdtweetslist.prototype”[undefined]的结果不是对象 提前

我正在尝试从Topsy获取分页json响应(http://code.google.com/p/otterapi/)我在合并对象时遇到问题。我希望在浏览器中执行此操作,因为api速率限制为每个ip/用户,并且服务器端的待办事项率较低

这是我的密码。有更好的办法吗?当然有,因为这不起作用。我想我想让它工作,但也要了解是否有更安全和/或更有效的方法

我收到的错误消息是

TypeError:表达式“window.holdtweetslist.prototype”[undefined]的结果不是对象

提前谢谢

干杯 斯蒂芬

$(“#gettweets”).live('click',函数(事件){
event.preventDefault();
getTweets('stephenbaugh');
});
函数getTweets(名称){
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;
警报(基地);
$.ajax({
数据类型:“json”,
url:BASE,
成功:功能(数据){
window.responcesreceived=1;
var响应=data.response;
警报(响应总数);
window.totalweets=response.total;
window.pagestoget=Math.ceil(window.totalweets/window.TWEETSPERPAGE);
window.holdtweetslist=response.list;
window.holdtweetslist.prototype.Merge=(函数(ob){var o=this;var i=0;for(ob中的var z){if(ob.hasOwnProperty(z)){o[z]=ob[z];}}返回o;});
//警报(数据);
获取tweets(数据);
var循环计数器=1;
做
{
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;
警报(基地);
$.ajax({dataType:“json”,url:BASE,success:gotweets(data)});
}

while(currentpage您正在以静态方法调用
Merge
,但将其声明为“实例”方法(用于
prototype
保留字)

从合并声明中删除
prototype
,这样您就可以:

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

这将修复javascript错误。

这是Topsy的Vipul。您是否可以共享您收到的文字JSON?我想确保您没有收到错误的响应。

感谢Edgar和Vipul的帮助。不幸的是,他们能够回答我的问题。我已设法确定问题是j查询未正确解析json,需要将jsonp与topsy一起使用

下面是我创建的一个小测试

创建包含此对象的文档

<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所需数量的tweet

再次感谢大家

$("#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>');
        }

}
$(“#gettweets”).live('click',函数(事件){
event.preventDefault();
getTweets('stephenbaugh');
});
var MAX_TWEETS=500;
var TWEETSPERPAGE=50;
var BASE=http://otter.topsy.com/search.json';
var-currentpage;
风险值响应;
var totalweets;
var pagestoget;
var totalweets;
var TWEETSPERPAGE;
var holdtweetslist=[];
var请求权;
风险值响应;
var tweetsfound;
var nametoget;
函数getTweets(名称){
nametoget=名称;
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,
数据类型:“jsonp”,
成功:功能(数据){
getalltweets(数据);
}
});
};
函数getalltweets(数据){
totalweets=data.response.total;
$(“#gettweets”).append(“”+“total tweets”+totalweets+”

); $(“#gettweets”).append(“”+“max tweets”+max#u tweets+”

); 如果(最大推文数<总推文数){ 总weets=500 } $(“#gettweets”).append(“”+“新的总计tweets”+总计tweets+”

”); 获取tweets(数据); pagestoget=Math.ceil(totalweets/TWEETSPERPAGE); var getpagesint=self.setInterval(函数(){ 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, 数据类型:“jsonp”, 成功:功能(数据){ 获取tweets(数据); } }); 如果(currentpage==pagestoget){ $(“#gettweets”).append(“”+“已完成发送”+currentpage+”,共“+pagestoget+”

”); 清除间隔(getpagesint); }; }, 2000); }; 函数获取tweets(数据) { responcesreceived=responcesreceived+1; holdlist=data.response.list; 对于(保留列表中的x) { holdtweetslist.push(holdlist[x]); } //var family=parents.concat(children); $(“#gettweets”).append(“receipt”#“+responcesreceived+”-是页面:“+data.response.page+”数组长度=“+holdtweetslist.length+”

”); //holdtweetslist.Merge(response.list); tweetsfound=tweetsfound+data.response.total; if(responcesreceived==pagestoget){ //sendforprocessingsendtweetlist(); $(“#gettweets”).append(“”+“已完成接收”+responcesreceived+”+pagestoget+“

”); } }
谢谢埃德加。我现在得到一份不同的
$("#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>');
        }

}