2013-12-04 1 views
16

Скажем, у меня есть функция:Сроки в JS - несколько setИнтервалы запускаются одновременно и запускаются одновременно?

myFunc = function(number) { 
    console.log("Booyah! "+number); 
} 

И я хочу, чтобы работать на заданном интервале. Похоже, я должен использовать setInterval, да!

Но что, если я хочу запустить несколько интервалов одной и той же функции, все началось с того же времени?

setInterval(function(){ 
    myFunc(1); 
}, 500); 

setInterval(function(){ 
    myFunc(2); 
}, 1000); 

setInterval(function(){ 
    myFunc(3); 
}, 2000); 

Так что первый работает ровно два раза в то время он занимает второе место, чтобы запустить один раз, и то же самое между вторым и третьим.

Как вы убедитесь, что все они запускаются одновременно, чтобы они синхронизировались?

+0

читает http://ejohn.org/blog/how-javascript-timers-work/ –

+0

javascript следует за одним потоковым шаблоном выполнения, поэтому в любой момент времени может быть выполнен один активный скрипт .... так что хотя набор таймеров активирован, он ставится в очередь до завершения активных скриптов. –

+0

Ну, чертовски. Спасибо за ссылку, узнали что-то новое сегодня! –

ответ

15

Хороший вопрос, но в JS вы не можете. Для одновременного выполнения нескольких функций в одной и той же программе вам понадобятся многопоточность и некоторые глубокие навыки обработки времени и потоков. JS однопоточный. setInterval не выполняет функцию после задержки, а после задержки добавляет функцию к стеку событий, который будет запущен, как только процессор сможет добраться до него. Если proc занят другой операцией, для фактического запуска потребуется больше времени задержки. Несколько интервалов/тайм-аутов - все это добавление вызовов в один и тот же стек событий, поэтому они запускаются поочередно, когда доступен процесс.

2

JavaScript не имеет резьбы. Вы можете использовать веб-рабочий html5 или рекурсивно использовать setTimeout. Создание нескольких функций следуя этому примеру:

var interval = setTimeout(appendDateToBody, 5000); 

function appendDateToBody() { 
    document.body.appendChild(
     document.createTextNode(new Date() + " ")); 
    interval = setTimeout(appendDateToBody, 5000); 
} 

Читать эту статью:

http://weblogs.asp.net/bleroy/archive/2009/05/14/setinterval-is-moderately-evil.aspx

+0

У вас есть пример работы нескольких веб-мастеров HTML5? – Sushil

4
function Timer(funct, delayMs, times) 
{ 
    if(times==undefined) 
    { 
    times=-1; 
    } 
    if(delayMs==undefined) 
    { 
    delayMs=10; 
    } 
    this.funct=funct; 
    var times=times; 
    var timesCount=0; 
    var ticks = (delayMs/10)|0; 
    var count=0; 
    Timer.instances.push(this); 

    this.tick = function() 
    { 
    if(count>=ticks) 
    { 
     this.funct(); 
     count=0; 
     if(times>-1) 
     { 
     timesCount++; 
     if(timesCount>=times) 
     { 
      this.stop(); 
     } 
     } 
    } 
    count++; 
    }; 

    this.stop=function() 
    { 
    var index = Timer.instances.indexOf(this); 
    Timer.instances.splice(index, 1); 
    }; 
} 

Timer.instances=[]; 

Timer.ontick=function() 
{ 
    for(var i in Timer.instances) 
    { 
    Timer.instances[i].tick(); 
    } 
}; 

window.setInterval(Timer.ontick, 10); 

И использовать его:

function onTick() 
{ 
    window.alert('test'); 
} 
function onTick2() 
{ 
    window.alert('test2'); 
} 
var timer = new Timer(onTick, 2000,-1); 
var timer = new Timer(onTick2, 16000,-1); 

Для конечного числа клещей, изменения последний параметр - положительное целое число. Я использовал -1 для указания непрерывного хода.

Игнорировать любого, кто говорит вам, что вы не можете. Вы можете сделать все, что угодно!

1

Вы можете сделать что-то вроде этого.

arr = Array(); 
arr[0] = "hi"; 
arr[1] = "bye"; 
setTimer0 = setInterval(function(id){ 
    console.log(arr[id]) 
},1000,(0)); 

setTimer1 = setInterval(function(id){ 
    console.log(arr[id]); 
},500,(1)); 

Надеюсь, это поможет!

+0

Этот вопрос был отправлен и ответил 2 года назад. Пожалуйста, объясните, почему этот ответ лучше –

+1

У меня была такая же проблема, и эта работа отлично подходит для меня. Его из книги «Тайны JavaScript ниндзя» Джона Ресига. – Bartuken