使用JavaScript合并JSON api响应
我试图从Topsy(http://code.google.com/p/otterapi/)获得分页的json响应,并且遇到合并对象的问题。我想在浏览器中这样做,因为api速率限制是每个ip /用户,并且低到可以做服务器端的事情。使用JavaScript合并JSON api响应
这是我的代码。有没有更好的办法?当然,这是因为这不起作用。我想我想让这个工作,但也要了解是否有一个更安全,和/或更有效的方式。
该错误消息我得到的是...
类型错误:表达式“window.holdtweetslist.prototype”的结果[未定义]不是一个对象。
在此先感谢。
干杯 斯蒂芬
$("#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&[email protected]' + 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&[email protected]' + 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);
}
}
谢谢埃德加和维普尔的帮助。不幸的是,他们能够回答我的问题。我设法解决了这个问题是jquery的组合,不能正确解析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所需的推文数量循环播放。
再次感谢大家。
$("#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&[email protected]' + 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&[email protected]' + 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>');
}
}
要调用Merge
作为一个静态方法,但它声明为“实例”的方法(对于prototype
保留字)。
从合并声明删除prototype
,所以你必须:
window.holdtweetslist.Merge = (function(ob)...
这将解决JavaScript错误。
这是Topsy的Vipul。你会分享你收到的文字JSON吗?我想确保你没有收到破坏的回应。
这就是我得到的,如果我在浏览器中运行它....对不起,我不能填充响应,因为没有足够的字符。但你可以在这里看到http://otter.topsy.com/search.json?type=tweet&perpage=5&window=a&nohidden=0&[email protected]&page=1 – 2011-04-29 01:41:58
感谢您留意Vipul BTW的帖子。我认为我的脚本不是api,而是错误的。很酷的服务,欢呼。谢谢 – 2011-04-29 01:43:29
谢谢埃德加。我现在得到一个不同的错误。我想我仍然相当困惑之间的数组,和JSON对象等... ReferenceError:无法找到变量:ARRAY – 2011-04-28 08:17:37
不客气。嗯..它是否直接说“ARRAY”? PS:如果你认为它有用,请提高我的答案。谢谢 – 2011-04-28 08:22:21
我已经提出了答案,但实际上并没有解决它。是的,这是我现在得到的错误消息。欢呼 – 2011-04-28 08:27:15