Javascript nodejs-在解析中将全局变量传递给promise回调
考虑一下这个代码Javascript nodejs-在解析中将全局变量传递给promise回调,javascript,node.js,parse-platform,parse-server,Javascript,Node.js,Parse Platform,Parse Server,考虑一下这个代码 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(); } ); } eq返回对象,update更新该对
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();
}
);
}
eq
返回对象,update
更新该对象并保存它
如果这样的事情有可能的话,那不是很棒吗。。。(不确定它是否也能工作)
for(变量i=0;i
这实际上不起作用,只是因为作用域var
。您只需通过以下方式即可按需运行示例:
a) 使用let
代替var
b) 为i
创建一个新范围(这就是let
的基本功能)。(在匿名fn中,为了清晰起见,我使用了ii
而不是I
。I
也可以):
for(变量i=0;i
这实际上不起作用,只是因为作用域var
。您只需通过以下方式即可按需运行示例:
a) 使用let
代替var
b) 为i
创建一个新范围(这就是let
的基本功能)。(在匿名fn中,为了清晰起见,我使用了ii
而不是I
。I
也可以):
for(变量i=0;i使用解析解决此问题的最佳方法是使用递归性
...
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);
}
);
}
}
使用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);
}
);
}
}
在javascript中,使用var声明的所有变量都是函数作用域。您之所以会遇到此问题,是因为行数据[i].username以异步方式执行,而此时我引用的是数据的最后一个(或某些其他)索引。为了克服这种情况,我们使用闭包,如@Tomas@JitendraKhatri@Tomas我认为这不会起作用,因为在解析中,我们不能将变量传递给然后回调。。。Tomas使用了建议作为解决方案的第二个示例then(function(token,data[i]{…}
),但是parse使用then(function(token){…}
是的,我可以看到问题所在-我只是直接编辑了您提供的第二段代码-这是不正确的。我将编辑answerIn javascript使用var声明的所有变量都是函数范围的。您之所以会遇到这个问题,是因为行数据[I]。username以异步方式执行,而此时我指的是最后一段代码(或其他)数据索引。为了克服这种情况,我们使用闭包,如@Tomas@JitendraKhatri@Tomas我认为这不会起作用,因为在parse中,我们无法将变量传递给then callback
…Tomas使用了建议的第二个示例作为解决方案then(函数(令牌,数据[I]{…)
但是parse使用然后(函数(令牌){…}
是的,我可以看到问题-我只是直接编辑了您提供的第二段代码-这是不正确的。我将编辑答案
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)
}
...
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);
}
);
}
}