2015-05-27 4 views
0

EDIT: что я имею в виду под огнями несколько раз, это то, что newjob() будет срабатывать 3 раза, каждые 5 секунд ... так что через 20 секунд я буду иметь его 12 раз, а не 4 раза, что я хотел бы. поэтому он срабатывает несколько раз каждые 5 секунд, а не раз каждые 5 секунд.setInterval триггеры функция несколько раз

У меня есть функция, которую я создал с помощью Toastr для отображения сообщения в моем веб-приложении. я в конечном итоге собираюсь связать его с ajax-запросом API, чтобы определить, показывать или нет сообщение, но на данный момент я просто проверяю, как это выглядит.

Я устанавливаю интервал, но он выполняет функцию внутри него несколько раз (обычно 3).

$(document).ready(function() { 
    setInterval(function() { 
     newJob(); 
    }, 5000); 
}); 

я не могу сделать setInterval (функция (е) {}, как е не определено, так как нет ни одного события, связанные с ним, по щелчку, я использовал e.stopImmediatePropagation(), чтобы он только стрелять однажды как я могу остановить это немедленное распространение на заданном интервале, если я не е

спасибо

EDIT:.?. полный код:

var newJob = function(e) { 
    var i = -1; 
    var $toastlast; 

    var getMessage = function() { 
     var msgs = ["There's a new job in the job dispatch queue", "A job pending approval has timed out"]; 
     i++; 
     if (i === msgs.length) { 
      i = 0; 
     } 

     return msgs[i]; 
    }; 

    var shortCutFunction = "success"; // 'success' or 'error' 

    toastr.options = { 
     closeButton: true, 
     progressBar: true, 
     debug: false, 
     positionClass: 'toast-top-full-width', 
     onclick: null, 
     timeOut: "0", 
     extendedTimeOut: "0", 
     showDuration: "0", 
     hideDuration: "0", 
     showEasing: "swing", 
     hideEasing: "linear", 
     showMethod: "fadeIn", 
     hideMethod: "fadeOut", 
    }; 


    toastr.options.onclick = function() { 
     window.location.href = "/dispatcher"; 
    }; 

    var msg = getMessage(); 

    $("#toastrOptions").text("Command: toastr[" 
        + shortCutFunction 
        + "](\"" 
        + msg 
        + "\")\n\ntoastr.options = " 
        + JSON.stringify(toastr.options, null, 2) 
    ); 

    var $toast = toastr[shortCutFunction](msg); 

}; 

$(document).ready(function() { 
    setInterval(function() { 
     console.log('set interval'); 
     newJob(); 
    }, 5000); 


}); 

и это мой index.phtml файл:

<?php 
echo $this->headScript()->appendFile($this->basePath() . '/plugins/toastr/toastr.js') 
echo $this->headScript()->appendFile($this->basePath().'/js/dispatchernotification.js'); 
    ?> 

все, что я делаю это добавление JavaScript, что я хочу, чтобы мой работает index.phtml файл и библиотеки toastr. by console.loging внутри интервала, я получаю три журнала.

вот fiddle..not уверен, как запустить его, хотя, как это на готовом http://jsfiddle.net/efecarranza/rfvbhr1o/

+1

Ваша цель? setInterval предназначен для запуска несколько раз. – Zee

+0

Исходя из вашего кода, 'setInterval' срабатывает каждые 5 секунд. Разве это не то, что вы хотите? Если вы хотите, чтобы он срабатывал только один раз, вместо этого используйте 'setTimeout'. –

+0

Извините, я хотел сказать, что newJob() срабатывает несколько раз, каждые 5 секунд ... так каждые 5 секунд, я получу 3 экземпляра newjob – efecarranza

ответ

2

setInterval будет продолжаться бесконечно. Я думаю, вы ищете setTimeout.

+0

извините, я хотел сказать, что newJob() срабатывает несколько раз, каждые 5 секунд ... поэтому каждые 5 секунд я получаю 3 экземпляра newjob – efecarranza

1

setInterval: вызов функции повторно каждые х миллисекунды
setTimeOut: вызвать функцию после х миллисекунд.

У вас есть два варианта:

ясно, что интервал, когда не нужно больше:

var intervalId; 
$(document).ready(function() { 
    intervalId = setInterval(function() { 
     newJob(); 
    }, 5000); 
}); 

// At some other point 
clearInterval(intervalId); 

Или простое решение в вашем случае, используйте SetTimeout:

$(document).ready(function() { 
     setTimeout(function() { 
      newJob(); 
     }, 5000); 
    }); 
+0

i miscommunicated, что происходило: мой newJob срабатывает несколько раз, за ​​«оборот» или «цикл» setinterval, поэтому он будет запускаться много раз за 5 секунд, а не раз каждые 5 секунд – efecarranza

+0

У вас есть этот код повторен где-то? Как выглядит функция newjob? – Kenneth

+0

там я добавил полный код и скрипку, не уверенный, как бежать, хотя он готов. – efecarranza

0

Это поможет, если вы можете добавить jsfiddle с кодом, чтобы мы могли точно понять, что происходит. Возможно, по какой-либо причине функция setInterval вызывается несколько раз. Попробуйте добавить инструкцию console.log в начале этой функции, чтобы проверить, так ли это.

Если и вы не можете понять, почему (и ни мы можем, не зная свой код), вы можете разместить чек в начале функции, как это:

if (typeof this.installInterval.done == "undefined") { 
    /*a bunch of code*/ 
    this.installInterval.done = true 
} 
+0

добавил скрипку, но не уверен, как запустить ее наготове. – efecarranza

+0

Каково намеренное поведение? Как ваш код настроен, единственным сообщением, которое когда-либо будет показано, является «В задаче диспетчера очереди есть новое задание». Вы меняете i до -1 каждый раз, когда вы вызываете newJob, который один раз каждые 5000 мс. Кроме того, убедитесь, что вы выбрали jquery в фреймах слева в jsfiddle, иначе ваш код не будет работать. – evalunamain

+0

он отлично работает на скрипке, спасибо за разъяснение jquery. возможно, это фреймворк zend или что-то, что отображает его дважды, я должен проверить, что тогда я предполагаю. Я расширяю его для запуска через запрос ajax post позже, ajax запускает каждые столько секунд, проверяет что-то против API, а затем в случае успеха или неудачи ответа будет отображаться другое сообщение. – efecarranza

0

Убедитесь в том, поставьте setInterval за пределами $(document).ready(function() {...}).Так что это будет так:

<script> 

$(document).ready(function() { 
    ... some code ... 
}); 

var myInterval; 
clearInterval(myInterval); 
myInterval = setInterval(function() { 
    ... your code is here ... 
}, 5000); 

</script> 

По какой-то причине, если это в $(document).ready() каждый раз, когда вы динамически принести ту же страницу снова дважды устанавливает setInterval в прогрессии и clearInterval функция не поможет, пока вы на самом деле не освежить браузер.