Javascript 使用Parse更正for循环中的顺序

Javascript 使用Parse更正for循环中的顺序,javascript,arrays,parse-platform,Javascript,Arrays,Parse Platform,我想创建一个包含对象的数组,并使用Parse查询所有数据 然而,循环结果的for循环并没有按照正确的顺序执行,而是随机循环数据。如果每次迭代我都记录I,每次日志都会显示不同的结果 这是我的密码: for (var i = 0; i < results.length; i++) { Parse.Cloud.useMasterKey(); // retrieve params var objectid = results[i]; var self = request.params.userid

我想创建一个包含对象的数组,并使用Parse查询所有数据

然而,循环结果的for循环并没有按照正确的顺序执行,而是随机循环数据。如果每次迭代我都记录
I
,每次日志都会显示不同的结果

这是我的密码:

for (var i = 0; i < results.length; i++)
{
Parse.Cloud.useMasterKey();
// retrieve params
var objectid = results[i];
var self = request.params.userid;

// start query
var Payment = Parse.Object.extend("Payments");
var query = new Parse.Query(Payment);

query.get(objectid, {

    success: function (payment) {

        // get all the correct variables
        var from_user_id = payment.get("from_user_id");
        var to_user_id = payment.get("to_user_id");
        var amount = payment.get("amount");
        var createdAt = payment.updatedAt;
        var note = payment.get("note");
        var img = payment.get("photo");
        var location = payment.get("location");
        var status = payment.get("status");

        var fromquery = new Parse.Query(Parse.User);
        fromquery.get(from_user_id, {

            success: function(userObject) {

                var fromusername = userObject.get("name");

                var currency = userObject.get("currency");

                var toquery = new Parse.Query(Parse.User);
                toquery.get(to_user_id, {

                    success: function(touser)
                    {

                        var tousername = touser.get("name");

                        if(tousername !== null || tousername !== "")
                        {
                            sendArray(tousername);
                        }

                    },
                    error: function(touser, error)
                    {

                        var tousername = to_user_id;

                        if(tousername !== null || tousername !== "")
                        {
                            sendArray(tousername);
                        }

                    }

                });

                function sendArray(tousername) {

                    var array = new Array();

                    // create the time and date
                    var day = createdAt.getDate();
                    var year = createdAt.getFullYear();
                    var month = createdAt.getMonth();
                    var hour = createdAt.getHours();

                    var minutes = createdAt.getMinutes();

                    // create the timestamp
                    var time = "" + hour + ":" + minutes;
                    var date = "" + day + " " + month + " " + year;

                    var associativeArray = {};

                    if(self == from_user_id)
                    {
                        fromusername = "self";
                    }
                    if(self == to_user_id)
                    {
                        tousername = "self";
                    }

                    associativeArray["from"] = fromusername;
                    associativeArray["to"] = tousername;
                    associativeArray["amount"] = amount;
                    associativeArray["currency"] = currency;
                    associativeArray["date"] = date;
                    associativeArray["time"] = time;
                    associativeArray["status"] = status;

                    if(note == "" || note == null)
                    {
                        associativeArray["note"] = null;
                    }
                    else
                    {
                        associativeArray["note"] = note;
                    }

                    if(img == "" || img == null)
                    {
                        associativeArray["img"] = null;
                    }
                    else
                    {
                        associativeArray["img"] = img;
                    }

                    if(location == "" || location == null)
                    {
                        associativeArray["location"] = null;
                    }
                    else
                    {
                        associativeArray["location"] = location;
                    }

                    array[i] = associativeArray;

                    if((i + 1) == results.length)
                    {
                        response.success(array);
                    }

            },
            error: function(userObject, error)
            {
                response.error(106);
            }

        });

    },
    error: function(payment, error) {

        response.error(125);

    }

});
}
for(var i=0;i
但是
i
变量始终设置为7,因此关联数组附加在数组[7]中,而不是正确的
i
(如1,2,3,4,5)

这之所以如此重要,是因为我想按时间顺序排列付款(我在提供结果的查询中已经这样做了)


我能做些什么来解决这个问题呢?

成功是一个在稍后时间点发生的回调。所以发生的是,for循环运行7次,调用parse 7次。然后在它运行完每个parse Success调用后,它们将执行I,现在是7

解决这个问题的一个简单方法是将整个过程包装在一个立即函数中,并为i创建一个新的闭包

for(var i = 0; i < results.length; i++){
   function(iClosure) {
      //rest of code goes here, replace i's with iClosure
   }(i);
}
for(var i=0;i

现在将发生的是,每个success函数都将访问它自己的iClosure变量,并在循环中创建它们时将它们设置为i的值。

阅读javascript中闭包的工作原理,这就是为什么我总是7的原因。@MattR感谢您的帮助。但是我仍然不明白为什么
i
总是7号。你能给我指一下正确的方向吗?谢谢!这真的很有帮助