使用下面的脚本我正在尝试创建一个名为temptagarray的对象,该对象将填充Tumblr博客上的所有标签及其频率。所以它应该看起来像这样:
{'performance': 10, 'installation': 5}
我知道对象正在创建并且它看起来是正确的(我可以在每个循环中打印出来)但我无法弄清楚如何在函数之后/之外使用它,即在我尝试的脚本底部到document.write()它。这是一个全局/局部变量问题,返回问题还是我需要以某种方式解决它?
<script type="text/javascript">
var temptagarray = {};
var tags;
var tag;
function loadPosts () {
var key = "api_key=9I4rZAYQCbU1o5TSMZuyrlvXiQsNxKBicCJxNK5OKZ6G9pgdim";
var api = "https://api.tumblr.com/v2/blog/garrettlynch.tumblr.com/";
var retrieve_more = function (offset) {
$.getJSON(api + "posts?callback=?&filter=image&limit=20&offset=" + offset + "&" + key,function(data) {
//for each item (post) in the response
$.each(data.response.posts, function(i, item) {
//pull out the posts tags
tags = item['tags'];
//loop through the tags
for (i = 0; i < tags.length; i++)
{
tag = tags[i];
//if the tag already exists in the tag array
if (temptagarray[tag])
{
temptagarray[tag] = temptagarray[tag] + 1;
}
else
{
temptagarray[tag] = 1;
}
}
});
if (data.response.posts.length == 20) {
retrieve_more(offset + 20);
}
});
};
retrieve_more(0);
}
loadPosts();
document.write(JSON.stringify(temptagarray));
</script>
提前致谢 盖瑞特
答案 0 :(得分:1)
替换它:
if (data.response.posts.length == 20) {
retrieve_more(offset + 20);
}
......用这个:
if (data.response.posts.length == 20) {
retrieve_more(offset + 20);
} else {
document.write(JSON.stringify(temptagarray));
}
您遇到的问题是,尽管您的document.write(...)
命令位于代码中的ajax调用之下,但ajax调用是异步的,因此回调也将异步调用。基本上,在您有机会与ajax回调中的document.write(...)
变量进行交互之前很久就会调用temptagarray
。
答案 1 :(得分:0)
首先要做的事情 - AJAX is Async
异步。
因此代码块在执行下一行之前不会等待前一条指令完成。
因此,在回复回复之前,您的document.writeline
已经被执行了。
尝试在if块之后的成功回调中打印该信息,您确实会看到响应。
答案 2 :(得分:0)
感谢回复。下面是我现在作为一个可行的解决方案,因为结果将调用另一个函数。阅读更多我想知道我是否应该使用回调 - 它更好吗?
<script type="text/javascript">
//load posts from a Tumblr weblog
function loadPosts () {
//api key and weblog address
var key = "api_key=9I4rZAYQCbU1o5TSMZuyrlvXiQsNxKBicCJxNK5OKZ6G9pgdim";
var api = "https://api.tumblr.com/v2/blog/garrettlynch.tumblr.com/";
//tags object
var temptagarray = {};
//all tags and each tag
var tags;
var tag;
//looping function to keep retrieving posts until all are retrieved
var retrieve_more = function (offset) {
$.getJSON(api + "posts?callback=?&filter=image&limit=20&offset=" + offset + "&" + key,function(data) {
//for each item (post) in the response
$.each(data.response.posts, function(i, item) {
//pull out the posts tags
tags = item['tags'];
//loop through the tags
for (i = 0; i < tags.length; i++)
{
//pull out each tag
tag = tags[i];
//if the tag already exists in the tag array
if (temptagarray[tag])
{
//add 1 to its count
temptagarray[tag] = temptagarray[tag] + 1;
}
else
{
//set its count to 1
temptagarray[tag] = 1;
}
}
//to test object as it gets added to
//$("#Posts ul").append('<li>' + JSON.stringify(item, ['tags']) + '</li>')
});
//if the number of posts is more than 20
if (data.response.posts.length == 20)
{
//retrieve the next 20
retrieve_more(offset + 20);
}
else
{
//call the show result function
showresult(temptagarray);
}
});
};
//stop retrieving posts
retrieve_more(0);
}
loadPosts();
function showresult(tagarray)
{
$("#Posts ul").append('<li>' + JSON.stringify(tagarray) + '</li>');
//document.write(JSON.stringify(tagarray));
}
</script>