1 Востаннє редагувалося 221VOLT (23.02.2016 03:01:23)

Тема: pure js функція послідовного виконання дій

pure js функція послідовного виконання дій ---
наприклад для анімації, чи відправлення багатьох ajax запитів --
через певні інтервали часу один за одним, щоб не получалося "все на купу"

(такий собі аналог php-sleep в js --- напевно комусь пригодиться)

function typeString(elId, str, callback) {
    var i = 1, el = document.getElementById(elId);
    (function() {
        el.innerHTML = str.substr(0, i++);
        if (i > str.length) {
            callback();
        } else {
            setTimeout(arguments.callee, 300);
        }
    })();
}

typeString('t', 'Hello, javascript!', function() {
    alert('it\'s all !!');
});

2

Re: pure js функція послідовного виконання дій

Як вам мій аналог? http://replace.org.ua/post/50622/#p50622

Подякували: 221VOLT, koala2

3 Востаннє редагувалося 221VOLT (23.02.2016 03:24:44)

Re: pure js функція послідовного виконання дій

ktretyak написав:

Як вам мій аналог? http://replace.org.ua/post/50622/#p50622

ваша функція буде дуже корисна для деяких онлайн-магазинів, де часто на один клік миші - додається 2 екземляри товару у корзину :)

проте на мою думку ваша функція трошки інакше працює (або я зпросоння не у стані її тверезо оцінити зараз),
функція вище потрібна мені щоб зробити пару десятків тисяч послідовних запитів до одного сервера, і відповідно для кожного запиту з отриманою інфою зробити запити до іншого сервера +
при тому всьому не робити більше 10 запитів у секунду до першого сервера, і до другого також, в ідеалі по 1-3 запити в секунду, строго послідовно і "без каші" із запитів накупу))

4

Re: pure js функція послідовного виконання дій

А, зрозуміло, я думав що це у вас теж фільтр запитів, а виявляється це у вас типу "балансувальник".

Подякували: 221VOLT1

5 Востаннє редагувалося ktretyak (23.02.2016 04:05:47)

Re: pure js функція послідовного виконання дій

Від нічого робити, здається я написав коротший варіант:

var nextTime = 0;
 
var func = function(callback, period)
{
  nextTime += period;
  setTimeout(callback, nextTime);
}

Запускати можна так

function callback(){ console.log('called callback!') }

func(callback, 1000);
func(callback, 1000);
func(callback, 1000);
func(callback, 1000);
func(callback, 1000);
func(callback, 1000);

6

Re: pure js функція послідовного виконання дій

Попередній варіант не скидає змінної nextTime, а це треба обов’язково робити, тому прокачаний варіант такий:

var
nextTime = 0
,timeout = 1000
,timer;
 
var func = function(callback)
{
  nextTime += timeout;
  setTimeout(callback, nextTime);
  
  // Змінну nextTime треба обнуляти для наступної серії викликів
  clearNexTime();
}
 
var clearNexTime = function()
{
  if(typeof(timer) != 'undefined')
    clearTimeout(timer);

  timer = setTimeout(function(){ nextTime = 0 }, nextTime);
}

Викликати так:

function callback(){ console.log('called callback!') }

func(callback);
func(callback);
func(callback);
func(callback);
func(callback);
func(callback);
Подякували: 221VOLT1

7

Re: pure js функція послідовного виконання дій

Самі розумієте - не можу зупинитись, досконалості немає меж:

var
nextTime = 0
,timeout = 1000;
 
var func = function(callback)
{
  nextTime += timeout;
  
  setTimeout
  (
    function()
    {
      nextTime -= timeout;
      callback();
    }
    ,nextTime
  );
}

Викликати так

function callback(){ console.log('called callback!') }

func(callback);
func(callback);
func(callback);
func(callback);
func(callback);
func(callback);
Подякували: 221VOLT1

8

Re: pure js функція послідовного виконання дій

ого, це щось дуже круте - не можу на сонну голову "осознать" - висплюся і заціню-потестую))
дякую, можливо щось нове відкрию для себе

9

Re: pure js функція послідовного виконання дій

Ну суть коду, здається, така як у вас була заявлена в першому повідомленні даної теми - розрідити кучність запитів в рівномірну чергу із зазначеним таймаутом.