Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript nodejs-在解析中将全局变量传递给promise回调_Javascript_Node.js_Parse Platform_Parse Server - Fatal编程技术网

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);
                }
            );
        }
    }