2013-06-20 103 views
0

我試圖讓我的覆蓋層顯示更慢,而不是同時顯示所有。代碼完美工作,直到我添加setTimeout。當我嘗試運行它時,控制檯表示latLng未定義。setTimeout不起作用。控制檯說latLng沒有定義

經過搜索,我看到很多人都有類似的問題,但他們都沒有回答我的問題。

下面是該功能。讓我知道你是否需要更多的代碼。

function getAndDrop() { 
    $.ajax({ 
     url : 'php/locationarray.php', 
     success : function(data) { 
      latLng = data.split(" "); 

      for (i = 0; i < latLng.length; i++) { 
       setTimeout(function(){ 
       var loc = latLng[i].split("|"); 
       if (marker.length > maxOverlays) 
        clearSingleOverlay(); 
       addMarker(loc[0], loc[1]); 
       }, i*200); 
      } 
     } 
    }); 
} 

編輯:latLng被定義爲全局以上。這是當地的。我在全球範圍內嘗試調試

+0

@IvanL latLng包含空格分隔的座標。我不認爲這可能是問題,因爲它沒有setTimeout()就完美運行。當setTimeout()被移除時,它的功能就像我所期望的那樣。它將所有的覆蓋層都放得更快,看起來好像它們全都出現在同一時間 – user2465313

回答

5

你需要一個封閉:

success : function(data) { 
    var latLng = data.split(" "); 

    for (i = 0; i < latLng.length; i++) { 
     (function(LL){ 


      setTimeout(function(){ 
      var loc = LL.split("|"); 
      if (marker.length > maxOverlays) 
       clearSingleOverlay(); 
       addMarker(loc[0], loc[1]); 
      }, i*200); 


     })(latLng[i]); 

    } 
} 

讀到這裏澄清:Please explain the use of JavaScript closures in loops

PS。你應該創建一個專用函數來處理循環中的處理:

ie:for(...)handleCurrent();

-1

這是因爲latLng在閉包中不可用。你可以嘗試latLng聲明之前加入var

success : function(data) { 
    var latLng = data.split(" "); 

    for (i = 0; i < latLng.length; i++) { 
     setTimeout(function(){ 
     var loc = latLng[i].split("|"); 
     if (marker.length > maxOverlays) 
      clearSingleOverlay(); 
     addMarker(loc[0], loc[1]); 
     }, i*200); 
    } 
} 
+0

原來是這樣。我在全球範圍內嘗試調試 – user2465313

+0

> latLng在閉包中不可用。不是嗎?定義不帶'var'關鍵字的變量只是在'window'上下文中定義(即全局)。除非你不使用嚴格模式。 – Tommi