2014-02-24 23 views
0

您好我有這個函數中調用Ajax:當函數完成(包括的setTimeout(S))通話功能

for(var i in data){ 
    setTimeout((function(i) { 
     return function(){ 
      CreateMarker(data[i]); 
     }; 
    })(i), i*500); 
    } 

它添加標記在谷歌地圖,使用google.maps.Animation.DROP。 我需要當所有的標記都在地圖中時,下拉動畫變爲:setAnimation(google.maps.Animation.BOUNCE),我知道如何改變動畫。

這是我的問題: 我知道何時結束了ajax,但由於超時,我無法知道何時所有標記已被「刪除」到地圖中,因此我不提前更改動畫。

任何想法,我該怎麼做才能知道什麼時候所有的標記被放置在地圖中,所以我可以改變動畫? 謝謝!

回答

1

的解決方案將是後添加另一個setTimeout你的:

for(var i = 0; i<data.length; i++){ // assuming data is a contiguous array 
    setTimeout((function(i) { 
    return function(){ 
     CreateMarker(data[i]); 
    }; 
    })(i), i*500); 
} 
setTimeout(changeAnimation, (i-1)*500); 

changeAnimation功能將在最後一個CreateMarke之後立即執行河


我發現,當事情週期性重複的,它可以有很大的幫助,以取代setTimeoutsetInterval

var interval = setInterval(function(){ 
    var markerData = data.shift(); // changes data, use a copy if you want to use data anywhere else 
    if (markerData) CreateMarker(markerData); 
    else { clearInterval(interval); changeAnimation() } 
}, 500); 

在CreateMarker電話後changeAnimation將執行500毫秒這個簡單的版本,但它可以很容易地更改後立即執行:

var interval = setInterval(function(){ 
    var markerData = data.shift(); 
    CreateMarker(markerData); 
    if (!data.length){ clearInterval(interval); changeAnimation() } 
}, 500); 
+0

我使用了第一個解決方案,簡單,智能和低影響的代碼。謝謝! – Alejandro

1

您可以簡單地創建一個變量來計數放置的標記,並檢查每個標記是否完成。

var done = 0; 

for(var i in data){ 
    setTimeout((function(i) { 
     return function() { 
      CreateMarker(data[i]); 
      if (++done == data.length) { 
       // execute code here 
      } 
     }; 
    })(i), i*500); 
} 

這裏是用隨機數據的代碼的工作示例:http://jsfiddle.net/S3LQK/

0

你可以保持定時器計數,所以你可以當最後一個已解僱告訴。

既然你不顯示什麼類型的變量data的是,該解決方案將工作data是否是一個數組或對象(雖然你一般不應for (var i in data),所以我認爲這是一個迭代對象數組。

var timerCntr = 0; 
for(var i in data){ 
    ++timerCntr; 
    setTimeout((function(i) { 
     return function(){ 
      CreateMarker(data[i]); 
      if (--timerCntr === 0) { 
       // last timer is done now 
      } 
     }; 
    })(i), i*500); 
}