2016-09-08 3 views
1

Есть ли способ запустить мою функцию в течение 5 секунд в Javascript?Javascript + Запуск функции в течение X секунд

Например, если у меня есть Function A и Function B. Я хочу запустить Function A в течение 5 секунд, сразу после этого он запустится Function B.

  • IF Function A занимает всего 1 секунду, чтобы завершить процесс, тогда ему нужно подождать еще 4 секунды.
  • Но если Function A занимает 3 секунды до конца, то ему потребуется еще 2 секунд, чтобы ждать, перед обработкой Function B
  • IF Function A занимает более 5 секунд, то B не нужно ждать, пока не закончит свою работу, пока он может начать свою работу. (Изм)

Сейчас им с помощью сна функции, которые я нашел, не давно

function wait(ms){ 
    var start = new Date().getTime(); 
    var end = start; 
    while(end < start + ms) { 
    end = new Date().getTime(); 
    } 
} 

wait(5000); 

Но с этим кодом, то нужно будет ждать в течение 5 секунд, независимо от того, сколько времени Function A потребности чтобы закончить процесс.

EDIT

Function A делает AJAX POST вызов. что заставляет занять много времени, чтобы закончить работу.

Этот вопрос отличается от What is the JavaScript version of sleep()?, потому что:

  1. это будет использоваться в IE, который не поддерживает обещание (как я читал)
  2. Если я использую SetTimeout и А занимает больше времени, чем 5 секунд, затем B сначала запустит его, не дожидаясь окончания A.
+0

Вы хотите сказать, что функция a занимает 7 секунд? – Roberrrt

+0

Является ли FunctionA выполнением асинхронной работы? Или это занимает 1 секунду по другим причинам? – casraf

+0

setTimeout, setInterval, $ evalAsync, $ applyAsync, веб-работники могут выполнять работу – zxxc

ответ

3

Я вижу эти легкие подходы к этому:

  1. Если Function A асинхронные (например, отправив запрос AJAX и ожидание ответа), просто используйте setTimeout, как запрос будет сделан в фоновом режиме и не замораживать основной процесс. Таким образом, funcA() будет немедленно выполняться в потоке пользовательского интерфейса, после чего сразу же произойдет следующее выражение (которое ждет 5 секунд), тогда обратный вызов из ответа AJAX будет вызван всякий раз, когда он будет получать ответ.

    funcA(); 
    setTimeout(funcB, 5000); 
    
  2. Если Function A занимает до 5 секунд и по другим причинам, и вам нужно ждать, чтобы быть более динамичным, вы, вероятно, время это и вычитать:

    var startTime = new Date().getTime(), endTime; 
    funcA(); 
    endTime = new Date().getTime(); 
    setTimeout(funcB, 5000 - (endTime - startTime)); 
    
  3. Если Function A может занять больше времени чем за 5 секунд, и Function B нужно ждать для этого, я предлагаю что-то похожее на это:

    function funcA() { 
        var startTime = new Date().getTime(), endTime; 
        // ... code ... 
        $.post(..., { 
        ..., 
        // when done/resolved the AJAX request -> 
        success: function(response) { 
         endTime = new Date().getTime(); 
         setTimeout(funcB, 5000 - (startTime - endTime)); 
        } 
        }); 
    } 
    
+0

Что делать, если 'funcA' занимает 5001 (или больше) миллисекунд заканчивать? 'waitTime = 5000 - (endTime - startTime); if (waitTime <0) {waitTime = 0; } ' – aifrim

+0

@aifrim Не нужно, потому что отрицательный таймаут автоматически преобразуется в минимум. – JJJ

+0

Что произойдет, если я воспользуюсь первым подходом, но для завершения функции FunctionA потребуется более 5 секунд. Запустит ли Func B свою работу, не дожидаясь ответа от FunctionA? – Mark