如何正确使用setTimeout或setInterval

时间:2015-08-12 07:20:25

标签: javascript

我正在使用谷歌地图,我试图暂停执行,以防止QUERY_LIMIT使用问题。我绘制地址的函数看起来像这样。

代码有效,但是我想尝试使用setTimeout或setInterval来查看它在UI上是否会更好看。

我如何称呼它,第一个参数应该是什么?

Thanx很多。

  vLocations = [];

  for (var i = 0; i < vAddresses.length; i++) {

    //pause to prevent OVER_QUERY_LIMIT issue
    //geocode "free" usage limit is 5 requests per second
    //setTimeout(PlotAddressesAsUnAssigned, 1000);
    //sleep(500);

    //this will resolve the address and store it in vLocations
    AddWaypointAndUnassigned(vAddresses[i]);

    var z = i % 4;
    if (z==0 && i != 0) {
     //sleep after every 5th geocode call
     //alert('going to sleep...i: ' + i);
     //sleep(3000);
    }

  }

3 个答案:

答案 0 :(得分:1)

在循环(同步)中执行暂停(异步执行)通常会导致很多麻烦。

您可以使用仅在超时结束时执行的递归调用。

var vLocations = [];

// Manages the timeout and recursive calls 
function AddWaypointAndUnassignedWithPause(index){
    setTimeout(function(){
        // When the timeout expires, we process the data, and start the next timeout
        AddWaypointAndUnassigned(vAddresses[index]);

        // Some other code you want to execute        
        var z = i % 4;
        if (z==0 && i != 0) {
            //sleep after every 5th geocode call
            //alert('going to sleep...i: ' + i);
            //sleep(3000);
        }    

        if(index < vAddresses.length-1)
            AddWaypointAndUnassignedWithPause(++index);
    }, 1000);
}

// Start the loop
AddWaypointAndUnassignedWithPause(0);

JSFiddle example.

答案 1 :(得分:0)

试试这个,希望这会有所帮助

vLocations = [];

for (var i = 0; i < vAddresses.length; i++) {

    //pause to prevent OVER_QUERY_LIMIT issue
      setTimeout(function(){
            //this will resolve the address and store it in vLocations
            AddWaypointAndUnassigned(vAddresses[i]);
       }, 500);
  var z = i % 4;
   if (z==0 && i != 0) {
    //sleep after every 5th geocode call
    //alert('going to sleep...i: ' + i);
    //sleep(3000);
   }

}

答案 2 :(得分:0)

等待线怎么样,当一个物品被添加时被触发,当没有物品时被停止。

使用setTimeout:

var INTERVAL = 1000 / 5;

var to = null;

var vLocations = [];

function addAddress(vAddress) {
    vLocations.push(vAddress);
    startTimeout();
}

function startTimeout() {
    if( to === null ) {
        to = setTimout(processLocation, INTERVAL);
    }
}

function processLocation() {

    if( vLocations.length ) {

        var vAddress = vLocations.shift();
        AddWaypointAndUnassigned(vAddress);

        to = setTimout(processLocation, INTERVAL);
    } else {
        to = null;
    }
}

使用setInterval:

var INTERVAL = 1000 / 5;

var to = null;

var vLocations = [];

function addAddress(vAddress) {
    vLocations.push(vAddress);
    startInterval();
}

function startInterval() {
    if( to === null ) {
        to = setInterval(processLocation, INTERVAL);
    }
}

function processLocation(cb) {

    if( vLocations.length ) {
        var vAddress = vLocations.shift();
        AddWaypointAndUnassigned(vAddress);
    } else
        clearInterval(to);
        to = null;
    }
}