变量范围或退货问题(不确定哪个)

时间:2015-07-20 23:00:18

标签: javascript jquery function object

使用下面的脚本我正在尝试创建一个名为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>

提前致谢 盖瑞特

3 个答案:

答案 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>