Javascript 使用Parse更正for循环中的顺序
我想创建一个包含对象的数组,并使用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
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号。你能给我指一下正确的方向吗?谢谢!这真的很有帮助