2017-02-20 6 views
1

Может ли кто-нибудь помочь мне разобраться в этих двух строках кода и улучшить их, чтобы фактически разрешить мне останавливать повторы?Понимание использования javascript, используемого с setTimeout и setInterval

var wait = ms => new Promise(r => setTimeout(r, ms)); 
var repeat = (ms, func) => new Promise(r => (setInterval(func, ms), wait(ms).then(r))); 

repeat(1000,() => Promise.all([myfunction()]) 
    .then(...) 
+1

https://jsfiddle.net/daronwolff/n10n17ag/ –

+1

Запишите их в «классическом» ES обозначения, заменив стрелка обозначения 'ввода => doAthing' с' функции (ввод) {doAthing} ', а затем посмотреть, понимаете ли вы, что он делает. –

+0

Предполагается ли это, что это какой-то асинхронный опрос? Как «запустить некоторую асинхронную функцию каждые n секунд»? – SimpleJ

ответ

4

Первая строка (ожидание) просто ждет определенное количество миллисекунд и затем заканчивается.

Вторая строка (повтор) программирует функцию, которая должна быть запущена за определенный интервал времени (setInterval), а затем вызывает wait и передает количество миллисекунд, установленных на функцию повторения. Эти функции вызываются только один раз. Внутренние элементы управления Javascript для setInterval - это то, что теперь берет управление при вызове () => Promise.all([myfunction()]) с запрограммированным временным интервалом.

Если вы просто идентифицируете свой код, все станет понятнее.

var wait = 
    ms => new Promise(
     r => setTimeout(r, ms) 
    ); 

var repeat = 
    (ms, func) => new Promise(
     r => (
      setInterval(func, ms), 
      wait(ms).then(r) 
     ) 
    ); 

repeat(1000,() => Promise.all([myfunction()])) 
.then(...); 

Для того, чтобы остановить функцию, вы должны захватить идентификатор интервала и называют clearInterval, как SimpleJ указал. Возможно, вам захочется сделать это с помощью обещаний, когда вы все в него вникнете. Таким образом, полный рабочий пример был бы:

var intervalID = 0; 

var wait = 
    ms => new Promise(
     r => setTimeout(r, ms) 
    ); 

var repeat = 
    (ms, func) => new Promise(
     r => (
      intervalID = setInterval(func, ms), 
      wait(ms).then(r) 
     ) 
    ); 

var myfunction = 
    () => new Promise(
     r => r(console.log('repeating...')) 
    ); 

var stopAfter5Secs = 
    () => new Promise(
     r => r(setTimeout(() => { 
        clearInterval(intervalID); 
        console.log('repeat end') 
       } , 5000)) 
    ); 

repeat(1000,() => Promise.all([myfunction()])) // 1000 miliseconds = 1 second 
.then(stopAfter5Secs()) // starts timer to end repetitions 
.then(console.log('repeat start')); // informs that all actions were started correctly and we are waiting for them to finish 

Promiss.all называет все promisses в любом interable объекта, переданного ему. В этом случае массив с одним элементом (myfunction). Я создал простую функцию, которая только записывает «повторение» на консоль, чтобы быть этой функцией. Но вы можете передать любое количество функций, которые вы хотите, если все они возвратят обещания.

Вы можете увидеть здесь работать: https://jsfiddle.net/9n2knxdg/7/

2

Вы можете разрешить интервал вернулся из setInterval сразу wait заканчивается в repeat и очистить интервал с clearInterval:

var wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); 
 

 
var repeat = (ms, func) => new Promise((resolve) => { 
 
    const interval = setInterval(func, ms); 
 
    wait(ms).then(() => resolve(interval)); 
 
}); 
 

 
repeat(1000,() => console.log("Repeated")) 
 
    .then((interval) => { 
 
    console.log("Stopping repeat"); 
 
    clearInterval(interval); 
 
    });

Хотя я не уверен, я понимаю, цель функции repeat.

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

  • Нет связанных вопросов^_^