2013-12-21 38 views
0

我对javascript/jquery比较新。'嵌套'for'循环未被触发,直到第一次'后'循环

我想运行一个嵌套的for循环动态创建HTML内容,然后将其添加到我的身体表中。第一个'for'循环从Parse中提取数据,并创建一个html表格行脚本,然后将其附加到html正文中的表格中。嵌套的'for'循环应该为第一个循环中的每个项目运行,并在正下方创建一个表格行元素。

但是,由于某种原因(我在调试时看到这个),第一个for循环在触发嵌套循环之前完成。是否有任何明显的原因或语法造成这种情况?

在此先感谢!

$(document).ready(function(){ 
     var currentUser = Parse.User.current(); 
     var htmlContent = ""; 
     if (currentUser) { 
      console.log(currentUser.get("full_name")); 
      $("#user").html(currentUser.get("full_name")); 

      var QrUrl = Parse.Object.extend("qr_url"); 
      var qr_query = new Parse.Query(QrUrl); 
      qr_query.equalTo("createdBy", currentUser); 
      qr_query.include("createdBy"); 
      qr_query.ascending("createdAt") 

      qr_query.find({ 
       success: function(qrid_results) { 
        for (var i = 0; i < qrid_results.length; i++) { 
         var qridentry = qrid_results[i]; 
         htmlContent="<tr><td>"+qridentry.get("title")+"</td><td>"+"Created"+"</td><td>"+qridentry.createdAt+"</td><td>"+qridentry.get("createdBy").get("full_name")+"</td></tr>"; 
         $('#trackingtable').append(htmlContent); 

         var QrLogger = Parse.Object.extend("qr_logger"); 
         var qrlog_query = new Parse.Query(QrLogger); 
         qrlog_query.equalTo("qrid", qridentry); 
         qrlog_query.include("createdBy"); 
         qrlog_query.include("qrid"); 

         qrlog_query.find({ 
          success: function(qrlog_results) { 
           for (var j = 0; j < qrlog_results.length; j++) { 
            var qrlogentry = qrlog_results[j]; 
            try{ 
             var user_id = obj.get("createdBy").get("full_name"); 
             console.log(user_id); 
            } 
            catch(err){ 
             user_id="Unknown Scanner"; 
            } 
            var dated = qrlogentry.updatedAt; 
            htmlContent="<tr><td>"+qrlogentry.get("qrid").get("title")+"</td><td>"+"Scanned"+"</td><td>"+dated+"</td><td>"+user_id+"</td></tr>"; 
            $('#trackingtable').append(htmlContent);  
           } 
          } 
         }); 
         //$('#trackingtable').dataTable({ }); 
        } 
       } 
      }); 
     } 
    }); 
+3

'qrlog_query.find'似乎是一个异步函数。 –

+3

这里并没有嵌套'for'循环。您需要了解**异步**接口如何工作。 – Pointy

+0

是否真的没有办法限制这一切作为同步功能? – mkirzon

回答

0

您对围绕第二个for循环的find方法的调用实际上是推迟执行,直到第二次找到完成为止。如果你想让inner for循环与第一个for循环同步执行,你需要构造你的代码,使得1.每个延迟执行都按照你想要的顺序被链接起来。 2.将所有HTML编辑转移到一个单独的函数中,该函数仅在所有qrlog查询成功执行后才执行,并将中间结果存储在某处,直到您准备好呈现HTML。

+0

非常感谢。不幸的是,经过数小时的努力实现这一点,我不能再困惑。我想我对实现你的第一个建议(链接延迟执行)更感兴趣。这是通过“承诺”完成的吗?如果是这样,你可以请帮忙,以便如何在for循环中完成这项工作吗? – mkirzon

1

这里有一个方法,使事情的承诺的工作,使得他们在他们所要的顺序运行,如果find是同步的:

qr_query.find().then(function(qrid_results) { 
    var promise = Parse.Promise.as(); 
    for (var i = 0; i < qrid_results.length; i++) { 
    promise = promise.then(function() { 
     // Build qrlog_query... 
     return qrlog_query.find(); 
    }).then(function(qrlog_results) { 
     for (var j = 0; j < qrlog_results.length; j++) { 
     // Do whatever synchronous work you want... 
     } 
    }); 
    } 
    return promise; 
}); 

```

欲了解更多信息,谷歌为[JavaScript的承诺]。

+0

谢谢!经过几天呼吸异步功能,我终于明白了:) – mkirzon