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

标签 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,因此关联数组附加在 array[7] 而不是正确的 i (如 1,2,3 ,4,5)

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

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

最佳答案

成功是在稍后的某个时间点发生的回调。所以发生的事情是,for 循环运行 7 次并调用 parse 7 次。然后在它运行后将执行每个解析成功调用,它们会查看现在为 7 的 i。

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

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

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

关于javascript - 使用 Parse 更正 for 循环中的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25329104/

相关文章:

c++ - 将对象加载到指向对象的指针数组中

swift - 解析类不是通过 swift 代码创建的

android - 过时的设备 : Parse Push Notification to Android devices

javascript - 使用 ES6 语法和动态路径导入模块

在数组中创建不同的随机数

javascript - 需要在下拉菜单中列出以在单击数字后显示结果

python - 使用 python 创建一个由 2 种颜色的框组成的图像

swift - 使用 AVPlayer Swift 2 进行 slider 控制

javascript - 传单 : Force panning

javascript - Vue - 循环遍历对象数组,并在单击时突出显示所选项目