2013-12-21 64 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