2016-03-13 2 views
0

Возможно ли сделать функцию «холостой» в течение нескольких секунд во время ее выполнения?Функция задержки jquery внутри функции?

Я попытался с

setTimeout(function(){ 
     $("#nytLevel").hide();       
} , 3000); 

Но остальные функции будут просто выполняться.

Ниже SetTimeout я начинаю функцию

function timer(){ 
     myVar = setTimeout(function(){ 
      console.log("SLOW"); 
     } , 10000);  
} 

, но когда прошло 10 секунд, он будет утешать журнал «SLOW», но она должна утешать его войти 13 секунд после того, потому что я поставил SetTimeout в 3 секунды.

+0

Как вы выполняете свой код? Какой порядок? Предоставленный код вообще не объясняет это .... – Rayon

+2

Это очень похоже на [проблема XY] (http://xyproblem.info). Почему вы не можете поместить вызов 'timer()' в первый тайм-аут? – JJJ

+0

@pushalu setTimeout - это асинхронная функция –

ответ

3

setTimeout() просто планирует что-то запустить в будущем, а остальная часть вашего Javascript продолжает работать. Он не блокирует дальнейшее выполнение Javascript. Это часто называют «асинхронной» операцией. Он работает в фоновом режиме и вызовет обратный вызов когда-нибудь в будущем, когда он завершит свою работу. Он также называется «неблокирующим», поскольку он не блокирует остальную часть вашего выполнения Javascript.

Все, что вы хотите, чтобы не запускать до setTimeout() пожара, необходимо поместить в обратный вызов setTimeout() или позвонить оттуда.

// define function 
function timer(){ 
    myVar = setTimeout(function() { 
      console.log("SLOW"); 
    }, 10000); 
} 

// schedule first timer 
setTimeout(function() { 
    $("#nytLevel").hide(); 

    // now start second timer 
    timer(); 
}, 3000); 

Стоит отметить, что JQuery имеет метод .delay(), который работает с анимацией и другими функциями, поставленных в очереди и иногда это может оптимизировать код. В приведенном выше случае, вы можете сделать это:

$("#nytLevel").delay(3000).hide().delay(10000).queue(function(next) { 
    console.log("SLOW"); 
    next(); // keep the queue moving in case there's something else in the queue 
}); 

Пожалуйста, обратите внимание, что .delay(xxx) работает только с методами Jquery, которые сами используют очереди (например, анимацию), или с помощью методов, вы кладете в очереди самостоятельно, используя .queue() (как я как показано выше).

+0

В моем коде содержится много операторов if, а таймер и setTimeout не совпадают , Поэтому мой таймер иногда не вызывается, даже если setTimeout. Но если вызывается setTimeout, таймер должен ждать. Но я думаю, что я попытаюсь сделать жесткий подход с некоторыми переменными. – PushALU

+0

@PushALU - Мы можем помочь вам очень хорошо, когда вы покажете нам свой реальный код (с инструкциями 'if'). Мы не можем вам очень помочь, если вы не покажете нам фактический код. – jfriend00

+0

@PushALU - Добавлена ​​информация о jQuery '.delay()' и '.queue()'. – jfriend00

1

setTimeout() - это асинхронная функция, означающая, что код не будет приостановлен до завершения setTimeout(). Если вы хотите код, который будет задержан вместе с setTimeout(), вы можете поместить другой код внутри начальная setTimeout()

setTimeout(function(){ 
    $("#nytLevel").hide(); 
    myVar = setTimeout(function(){ 
     console.log("SLOW"); 
    } , 10000);      
} , 3000); 
1

Я не рекомендовал бы это, но вы могли бы вылепить рекурсивная функция, чтобы сделать то, что вы хотели, используя флаг для диктата до или после таймаута. В приведенном ниже примере вы бы назвали как этот runAfterTimeout() или runAfterTimeout(false)

function runAfterTimeout(run) { 

    if (! run) { 
     console.log('about to wait 10 seconds'); 
     setTimeout(function(){runAfterTimeout(true)},10000); 
     return; 
    } 

    console.log('this section runs after 10 seconds'); 

    setTimeout(function(){$("#nytLevel").hide();},3000); 
} 

Fiddle: https://jsfiddle.net/m9n1xxra/

Имейте в виду, таймауты не 100% точным. Двигатель будет искать соответствующий перерыв в выполнении, чтобы выполнить то, что вы хотите, но если движок находится в середине чего-то другого, это будет выполняться первым.

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