使用Parse在for循环中更正顺序

时间:2014-08-15 15:16:40

标签: 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;

// 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);

    }

});
}

但是i var始终设置为7,因此关联数组会附加在数组[7]而不是正确的i(如1,2,3,4,5)< / p>

之所以如此重要,是因为我想按时间顺序订购付款(我在查询中提供了结果)。

我该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:2)

成功是在稍后的某个时间发生的回调。所以会发生什么,for循环运行7次并调用解析7次。然后,在运行每个解析成功调用之后,它们会查看i,现在是7。

解决这个问题的一个简单方法是将整个事物包装在一个立即函数中并为i创建一个新的闭包。像这样的东西

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

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