繁体   English   中英

每次迭代都不会重新分配for循环中的变量

[英]Variable in for-loop not being reassigned each iteration

我在for循环中有一个for循环。 第一个循环应该获得一个用户名,获得他们的评级,将它们附加到相同的列表项,然后重新开始使用下一个用户名,评级,追加等等,直到它通过朋友列表中的任何用户。

//Get usernames
var current = Parse.User.current();
var relation = current.relation("FriendRelations");
relation.query().find({

success: function(results) {

    for (var i = 0; i < results.length; i++) {

        //This shouldn't increment until the rating has been retrieved in the
        // next function.
        theuser = results[i].getUsername();

        $('ul').prepend('<li id = "frienditems_' + i + '"><div id ="friendname">' +
        results[i].getUsername() + '</div></li>');


        //Get friend's rating.
        //This is a query within a query.
        var GameScore = Parse.Object.extend("Rating");
        var query = new Parse.Query(GameScore);
        query.equalTo("user", results[i].getUsername());
        query.find({

            success: function(result) {

                //The log just outputs the last user's name each time, because I guess the 
                //other function already looped through completely, so it's forever set to the last one?**

                console.log(theuser);

                for (var y = 0; y < result.length; y++) {
                    var object = result[y].get("Rating");

                    //Logging the rating.
                    console.log("Rating:" + object);

                    $('#frienditems_' + y).append('<p class="friendrating">' + object + '</p>');
                }
            },
            error: function(error) {}
            });
        }
    }
});

这是我的console.log:

       John
       Rating:5
       John
       Rating:50
       John
       Rating:43
       John
       Rating:80

我希望它是这样的:

       George
       Rating:5
       Smith
       Rating:50
       Robert
       Rating:43
       John
       Rating:80

有人可以帮忙吗? 我看过其他问题,但我无法弄清楚如何将它们应用到我的情况中。 我希望我至少可以在第二个函数中访问第一个函数结果。

更新: Mihail的回答真的帮助了我。 控制台日志现在显示以正确顺序检索的数据。 但它仍然不是全部附加到其各自的列表项:

在此输入图像描述

您的问题是由对query.find()的异步调用引起的。 您实际上命令浏览器从云数据库中检索您的信息,并告诉他如果成功检索任何内容,该如何处理结果,同时代码继续执行(在您的情况下,for循环仍然遍历第一个集合)。

到第一个请求结束时,为了到达结尾,并且因为第二个查询的成功在第一个查询的范围内,所以变量theuser仍然被实例化并且具有可用的最后一个值。

为防止这种情况,您可以使用带参数的函数调用来更改变量的范围。 我重写了你的代码,它看起来像这样:

var current = Parse.User.current();
var relation = current.relation("FriendRelations");
var $ul = $('ul')
relation.query().find({        

    success:function(results){

        for(var i = 0; i < results.length; i++) {
            theuser = results[i].getUsername(); 

            // you can use <<var $friendrating = $("<li id='frienditems_" + i"'/>").html(...... >>
            var $friendrating = $(document.createElement("li")).attr("id", "frienditems_" + i).html('<div class="friendname">' + results[i].getUsername() + '</div>')
            $ul.prepend($friendrating);
            getUserRating(theuser, $friendrating);       
        }
    } 
});

function getUserRating(theUser, $node) {
    //Get friend's rating.
    //This is a query within a query.
    var GameScore = Parse.Object.extend("Rating");
    var query = new Parse.Query(GameScore);
    query.equalTo("user", theUser);
    query.find({

        success: function(result) {

            //The log just outputs the last user's name each time, because I guess the 
            //other function already looped through completely, so it's forever set to the last one?**

            console.log(theUser);

            for (var y = 0; y < result.length; y++) { 
                var object = result[y].get("Rating");

                //Logging the rating.
                console.log("Rating:" +object);

                $node.append('<p class="friendrating">' + object + '</p>');
            }
        },
        error: function(error) {
        }
    });
}

请注意,我没有测试过,我不是100%肯定它会在第一次尝试时起作用。

因为匿名回调函数success: function(result) {}在for循环结束后调用,在这种情况下,query.find()是一个异步调用,这意味着for循环将独立继续到下一次迭代,无论查询是否.find()已经返回。

变量theuser始终是最后一个for循环中用户的值,因为for循环能够在触发任何回调函数之前完成

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM