考虑这段代码
for (var i = 0; i < data.length; i++){
query.equalTo("objectId",data[i].id).first().then(
function(object){
object.set("username", data[i].username);
object.save();
}
);
}
在此示例中,data[i]
内的then callback
是数组的最后一个元素
考虑通常在javascript世界中工作的第二个例子
假设我们使用一些连接到mongodb并具有名为update
的函数的APIfor (var i = 0; i < data.length; i++){
query.eq("_id",data[i].id).update(data[i].username);
}
eq
返回对象,update
更新该对象并保存。
如果这样的事情成为可能,那会不会很棒......(不确定它是否也会起作用)
for (var i = 0; i < data.length; i++){
query.equalTo("objectId",data[i].id).first().then(
function(object, data[i]){
object.set("username", data.username);
object.save();
}
);
}
答案 0 :(得分:3)
这实际上只是因为范围var
而无效。您可以按照需要运行示例:
a)使用let
代替var
b)为i
创建新范围(这是let
基本上做的事情)。 (在匿名fn中,为了清楚起见,我使用ii
代替i
。i
也可以使用):
for (var i = 0; i < data.length; i++){
(function(ii) {
query.equalTo("objectId",data[ii].id).first().then(
function(object){
object.set("username", data[ii].username);
object.save();
}
);
})(i)
}
答案 1 :(得分:0)
使用parse
解决此问题的最佳方法是使用递归
...
var do = function(entries, i){
if (entries[i]){
let user = data[i];
query.equalTo("objectId", user.id).first().then(
function(object){
object.set("username", user.username);
object.save();
}
).then(
function(){
return do(entries, i + 1);
}
);
}
}