我想创建一个包含对象的数组,我正在使用 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/