2016-12-13 2 views
0

Я хотел бы добавить 500мс пауза между каждой итерации первого $.eachИспользование SetTimeout с JQuery каждый

Я не уверен, как применять это решение: How to add pause between each iteration of jQuery .each()?

в моем конкретном случае:

function iterateAddresses() { 

    var time = 500; 

    $.each(addresses_google, function(index, value) { 
    var service = new google.maps.DistanceMatrixService(); 

    service.getDistanceMatrix(
     { 
     origins: [origin], 
     destinations: value, 
     travelMode: 'DRIVING' 
     }, 
     callback 
    ); 

    function callback(response, status) { 
     var origins = response.originAddresses; 
     var destinations = response.destinationAddresses; 
     for (var i = 0; i < origins.length; i++) { 
     var results = response.rows[i].elements; 
     for (var j = 0; j < results.length; j++) { 
      var element = results[j]; 
      if(element.status == "NOT_FOUND"){ 
      var distance = 0; 
      } else { 
      var distance = element.distance.value; 
      } 
      if(distance > radius){ 
      // Store postids in array 
      postids_to_hide.push(
       addresses_postids[index][j] 
      ); 
      // Hide elements where postid is in the postids_to_hide arrays 
      $.each(postids_to_hide, function(index, value) { 
       $(".main_short_post_div").filter(function(){ 
       return $(this).attr('data-post-id') === value; 
       }).hide(); 
      }); 
      } // end if d < r 
     } // end for j 
     } // end for i 
    } // end callback function 
    }); // end each addresses_google 

}; // end iterateAddresses 

iterateAddresses(); 
+1

Возможный дубликат [Применение задержки между итерациями javascript для цикла] (http://stackoverflow.com/questions/11764714/applying-delay-between-iterations-of-javascript-for-loop) – Strelok

+0

Как вы можете видеть в моих итерациях есть целая куча кода, аргументов функции и переменных. Там лежит моя трудность. – Pim

+0

Итак, добавьте вещи в коллекцию, используйте тайм-аут и удалите элементы из коллекции. – epascarello

ответ

1

Вы могли бы выделить в другой функции, называемой так вашим iterateAddresses() функция

function iterateAddresses() { 

    var time = 500; 
    // Then get a random number between 500 and 599  
    $.each(addresses_google, function(index, value) { 
     var ram = Math.floor(Math.random() * (599-time+1)) + time; 
     setTimeout("OtherFunction("+index+","+value+");", ram); 
    }); // end each google_address 

}; // end iterateAddresses 


function OtherFunction(index, value) 
{ 
    var service = new google.maps.DistanceMatrixService(); 

    service.getDistanceMatrix(
     { 
     origins: [origin], 
     destinations: value,//addresses_google, 
     travelMode: 'DRIVING' 
     }, 
     callback 
    ); 

    function callback(response, status) { 
     var origins = response.originAddresses; 
     var destinations = response.destinationAddresses; 
     for (var i = 0; i < origins.length; i++) { 
     var results = response.rows[i].elements; 
     for (var j = 0; j < results.length; j++) { 
      var element = results[j]; 
      if(element.status == "NOT_FOUND"){ 
      var distance = 0; 
      } else { 
      var distance = element.distance.value; 
      } 
      var from = origins[i]; 
      var to = destinations[j]; 
      if(distance > radius){ 
      // Store postids in array 
      postids_to_hide.push(
       addresses_postids[index][j] 
      ); 
      // Hide elements where postid is in the postids_to_hide arrays 
      $.each(postids_to_hide, function(index, value) { 
       $(".main_short_post_div").filter(function(){ 
       return $(this).attr('data-post-id') === value; 
       }).hide(); 
      }); 
      } // end if d < r 
     } // end for j 
     } // end for i 
    } // end callback function 
} 

iterateAddresses(); 
+0

Я думаю, что единственная проблема здесь в том, что каждая итерация выполняется одновременно, время var должно увеличиваться на каждой итерации. Если я заменю «500» в вашем коде «временем» и добавлю прирост, я получаю целую кучу ошибок. – Pim

+0

Я предложил улучшить случайное число от 500 до 599. – edulego

1
function asyncForEach(arr, cb) { 
    return arr.reduce((p,c)=>{ 
     return p.then(()=>cb(c)); 
    }, Promise.resolve()); 
} 
function wait(ms) { 
    return()=>new Promise(resolve=>setTimeout(resolve, ms)); 
} 

const DELAY = 500; //ms 
function iterateAddresses() { 
    return asyncForEach(addresses_google, address => 
     getDistanceMatrix(address) 
     .then(processResult) 
     .then(wait(DELAY))); 
} 

iterateAddresses(); 

getDistanceMatrix является многообещающей версией функции, которую вы предоставили $.each.

processResult является многообещающей версией callback.

+0

Как я могу их обещать? :-) Никогда не слышал о обещаниях JS до сегодняшнего дня, я читаю их. – Pim

Смежные вопросы