Eugene
Eugene

Reputation: 43

how to use setTimeout or setInterval properly

I am using google maps and i am trying to put a pause in execution to prevent QUERY_LIMIT usage issue. My function that plots the addresses looks like this.

The code works, however i want to try setTimeout or setInterval to see if its going to look better on UI.

How do i call it, what should be the first argument?

Thanx alot.

  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);
    }

  }

Upvotes: 0

Views: 86

Answers (3)

blablabla
blablabla

Reputation: 1478

What about a waiting line, thats fired when an item is added and stopped when there are no items left.

With 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;
    }
}

With 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;
    }
}

Upvotes: 0

nioKi
nioKi

Reputation: 1289

Doing a pause (asynchronous execution) inside a loop (synchronous) will usually result in a lot of trouble.

You can use recursive calls that are done only when a timeout ends.

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.

Upvotes: 1

user3414348
user3414348

Reputation:

Try this, hope this will help

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);
   }

}

Upvotes: 0

Related Questions