Javascript Parse.com query.find success回调中的参数

Javascript Parse.com query.find success回调中的参数,javascript,cordova,callback,parse-platform,Javascript,Cordova,Callback,Parse Platform,提前谢谢你的帮助。 我正在使用Phonegap和Javascript进行一个练习助手。长话短说:我需要使用Parse.com来存储一些乐高迷你们的信息。我现在遇到的问题主要是由于我缺乏Javascript方面的经验 我正在努力让用户在数字上添加标签。用户输入它们,用逗号分隔,然后我拆分字符串。没问题 现在,我需要将尚不存在的标记添加到我的数据库中。为此,我搜索具有该描述的任何标记(使用query.find),然后,如果它存在,我不创建它,我只是修改关系。如果它不存在,我创建它,然后修改关系 我的

提前谢谢你的帮助。 我正在使用Phonegap和Javascript进行一个练习助手。长话短说:我需要使用Parse.com来存储一些乐高迷你们的信息。我现在遇到的问题主要是由于我缺乏Javascript方面的经验

我正在努力让用户在数字上添加标签。用户输入它们,用逗号分隔,然后我拆分字符串。没问题

现在,我需要将尚不存在的标记添加到我的数据库中。为此,我搜索具有该描述的任何标记(使用query.find),然后,如果它存在,我不创建它,我只是修改关系。如果它不存在,我创建它,然后修改关系

我的问题是:我似乎无法从query.find的成功回调中访问标记描述(字符串)。我很确定这是因为范围太广。除了结果数组之外,还有没有其他方法可以通过成功回调访问变量

我目前的代码如下:

                var Figure = Parse.Object.extend("Figure");
                var Tag = Parse.Object.extend("Tag");
                var nombre = $('#nombre').val();
                var serie = $('#serie').val();
                var figure = new Figure({"Name":nombre,"Series":serie});
                var tags = $('#tags').val();
                res = tags.split(","); //split the 
                figure.save().then(function() {
                    for (var i = 0; i < res.length; i++) { //for each tag

                        var query = new Parse.Query(Tag); //create the query.
                        query.equalTo("Description", res[i]);
                        query.find( {//execute query                                
                            success: function(results, res[i]) {
                             if (results.length > 0){ //if there are results.
                                var tag = results[0]; //get the tag
                                var relation_tag = tag.relation("figures"); //get the relation
                                relation_tag.add(figure); //add figure to relation
                                tag.save();
                              }
                             else { //if there are no results, the tag does not exist.
                                new_tag = new Tag({"Description":res[i]}); 
                               //ABOVE THIS LINE: res[i] is always undefined.
                                var relation_tag = new_tag.relation("figures"); //get the relation
                                relation_tag.add(figure); //add the figure
                                new_tag.save();
                              }
                            },
                            //error with query
                            error: function() {
                             alert("ERROR");
                            }


                        });     

                    }                                           


                }, function(error) {

                    alert("No se pudo guardar la figura");

                });
var Figure=Parse.Object.extend(“Figure”);
var Tag=Parse.Object.extend(“Tag”);
var nombre=$('#nombre').val();
var serie=$('#serie').val();
var图形=新图形({“名称”:nombre,“系列”:serie});
var tags=$('#tags').val();
res=标签。拆分(“,”)//分开
图.save().then(函数()){
对于(var i=0;i0){//如果有结果。
var tag=results[0];//获取标记
var relation_tag=tag.relation(“数字”);//获取关系
关系_tag.add(图);//将图添加到关系
tag.save();
}
else{//如果没有结果,则标记不存在。
new_tag=new tag({“Description”:res[i]});
//在这一行上面:res[i]总是未定义的。
var relation_tag=new_tag.relation(“图”);//获取关系
关系_tag.add(图);//添加图
新建_标记。保存();
}
},
//查询错误
错误:函数(){
警报(“错误”);
}
});     
}                                           
},函数(错误){
警报(“无东南部guardar la figura”);
});

在成功回调中,res[i]总是未定义的,我假设这是由于作用域的原因。

这是异步Javascript编程中非常常见的问题。你正在做这样的事情:

var Tag = Parse.Object.extend("Tag");
var query = new Parse.Query(Tag); 
for (var i = 0; i < array.length; i++) {
    anAsyncFunction(function(result) { // inner function
        doSomethingWith(array[i]);
    }
}
由于IIFE立即被调用,因此当前值为
i
被传递并存储到
j
中,当内部函数执行时,它使用正确的值

因此,在您的情况下,这应该是可行的:

success: (function(j) { // IIFE
    return function(results) {
        if (results.length > 0) {
            var tag = results[0];
            var relation_tag = tag.relation("figures");
            relation_tag.add(figure);
            tag.save();
        }
        else { //if there are no results, the tag does not exist.
            new_tag = new Tag({"Description":res[j]}); // j instead of i
             var relation_tag = new_tag.relation("figures");
            relation_tag.add(figure);
            new_tag.save();
        }
    }
})(i) // pass "value of i"
如果您愿意,还可以将描述本身而不是索引传递给IIFE(我想我会这样做):


这是异步Javascript编程中非常常见的问题。你正在做这样的事情:

for (var i = 0; i < array.length; i++) {
    anAsyncFunction(function(result) { // inner function
        doSomethingWith(array[i]);
    }
}
由于IIFE立即被调用,因此当前值为
i
被传递并存储到
j
中,当内部函数执行时,它使用正确的值

因此,在您的情况下,这应该是可行的:

success: (function(j) { // IIFE
    return function(results) {
        if (results.length > 0) {
            var tag = results[0];
            var relation_tag = tag.relation("figures");
            relation_tag.add(figure);
            tag.save();
        }
        else { //if there are no results, the tag does not exist.
            new_tag = new Tag({"Description":res[j]}); // j instead of i
             var relation_tag = new_tag.relation("figures");
            relation_tag.add(figure);
            new_tag.save();
        }
    }
})(i) // pass "value of i"
如果您愿意,还可以将描述本身而不是索引传递给IIFE(我想我会这样做):


对不起,我好像漏掉了一部分代码。我有。谢谢对不起,我好像漏掉了一部分代码。我有。谢谢您确定有符合条件的数据吗?代码看起来很好。您确定有符合条件的数据吗?代码看起来不错