Javascript 解释在解析中执行find函数inisde for循环背后的逻辑

Javascript 解释在解析中执行find函数inisde for循环背后的逻辑,javascript,jquery,parse-platform,Javascript,Jquery,Parse Platform,代码如下: function f1() { for (var i = 0; i < arr.length; i++) { var query = new Parse.Query("Group"); query.equalTo("parent", arr[i]); var position = pos[i]; alert("pos[i] = " + pos[i] + " position = " + position); query.find({

代码如下:

function f1() {
  for (var i = 0; i < arr.length; i++) {
    var query = new Parse.Query("Group");
    query.equalTo("parent", arr[i]);
    var position = pos[i];
    alert("pos[i] = " + pos[i] + " position = " + position);
    query.find({
      success: function(users) {
        if (users.length === 0) {
          alert("in if");
        } else {
          alert("in else");
        }
      }
    });
  }
}
但实际上,我明白了:

pos[i] = 8 position = 8
pos[i] = 15 position = 15      // I don't know why i am getting this, it is irritating me
in else
pos[i] = 15 position = 15
in if

我在互联网和谷歌上搜索过这个问题,但找不到更好的解决方案。那么如何获得所需的输出呢?

注意:永远不要使用
警报进行调试,当事情发生时,它对您的影响会误导您。您几乎总是希望使用浏览器中内置的调试器。即使这样也会打乱计时,也可以通过
console.log
记录事情

但是这里的主要问题是
query.find
调用的工作是异步的,它会在循环完成后调用
success
函数

如果您想知道找到了什么位置,您可以将该信息绑定到
success
回调并让它输出:

    var position = pos[i];
    query.find({
        // Note first arg v
        success: function(pos, users) {
            if (users.length === 0) {
                console.log("in if, pos = " + pos);  
            } else {
                console.log("in else, pos = " + pos);
            }
        }.bind(null, position) // *** Note bind
    });
Function#bind
返回一个新的“绑定”函数,当调用该函数时,该函数将使用给定的
值(上面未使用,因此初始值为
null
)调用原始函数,然后是传入
bind
的任何参数,然后是传递给绑定函数的参数

这可能有点难理解,因此这里有一个简单的示例:

函数foo(a,b){ log(“a=“+a+”,b=“+b”); } var f=foo.bind(null,'one'); f('two');//显示a=1,b=2
考虑使用Promise.when(),如下所示:

    var queries = [];

    for (var i = 0; i < arr.length; i++) {   
        var query = new Parse.Query("Group");
        query.equalTo("parent", arr[i]);
        var position = pos[i];
        alert("pos[i] = " + pos[i] + " position = " + position);
        queries.push(query.find());
    }
    Parse.Promise.when(queries).then(function() {
        var users = Array.prototype.slice.call(arguments);
        // users will contain the results of each query in corresponding positions
    });
var查询=[];
对于(var i=0;i

其思想是find()返回一个承诺来完成异步查找,promise.when()返回一个承诺,该承诺在传递给它的所有承诺都完成时实现。

Parse APi调用是异步的。您的循环将在数据返回之前完成。不太清楚你的问题是什么除了我编辑了这篇文章。。。基本上,我想做的是循环遍历所有用户,然后遍历父对象(指针)指向该用户的所有组,然后打印以控制这些组对象的名称字段,所以我使用findHave不知道您要做什么。警报按预期顺序触发。不要将警报用于此类调试。使用控制台I获取类型错误:a未定义…:(关于querys.push(query.find());不知道为什么?这是可行的,但这是否以随机方式工作?有时是指先在控制台上打印15,然后打印8,有时是相反的?@jain:这可能不是随机的,但是的,有些查询可能会比之前开始的查询完成得更快。如果你不想这样做,在成功之前不要开始后续查询ess上一个的回调。@jain:我在答案的末尾加了一个。
    var queries = [];

    for (var i = 0; i < arr.length; i++) {   
        var query = new Parse.Query("Group");
        query.equalTo("parent", arr[i]);
        var position = pos[i];
        alert("pos[i] = " + pos[i] + " position = " + position);
        queries.push(query.find());
    }
    Parse.Promise.when(queries).then(function() {
        var users = Array.prototype.slice.call(arguments);
        // users will contain the results of each query in corresponding positions
    });