Как выполнить функцию, когда setTimeout завершен?


2 принят

Вы можете передать дополнительный параметр, чтобы отметить последний элемент, а затем вызвать функцию внутри playAudio:

playAudio

ручка

или, возможно, самый простой способ - вызвать функцию напрямую:

removeHighlight

прямо до конца playPattern ().

Кроме того, надеюсь, вы знаете, что clearTimeout () всегда уничтожает ваш первый вызов, если не объявлять переменную внутри области forEach.


1

Создайте массив обещаний, которые разрешают playPatternсобытие звуковых элементов . Затем используйте, function playPattern (arr, done) { var patternIDs = { 0: 'blue', 1: 'green', 2: 'red', 3: 'yellow' } var iteratee = function (item, i, cb) { setTimeout(function (id) { playAudio(id) cb() }, 1000 * i, patternIDs[arr[i]]) } async.eachOf(arr, iteratee, done) } чтобы очистить блики, когда все обещания разрешены.

playPattern

1

setTimeoutФункция является асинхронным, и поэтому ваша playPatternфункция будет фактически вернуться до любого из playAudioзадержанных вызовов были сделаны.

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

Мне нравится использовать замечательную асинхронную библиотеку для этого типа вещей, но вы также можете добиться чего-то подобного с обещаниями. С его помощью вы переписываете свою playPatternфункцию следующим образом:

gamePlay

Теперь, когда вы вызываете playPattern, вы можете передать функцию как второй аргумент, который будет вызываться только после завершения всех завершенных setTimeoutвызовов. Вы можете переписать свою gamePlayфункцию следующим образом:

function gamePlay () {
  var testArr = [3, 2, 0, 1, 3]

  playPattern(testArray, removeHighlight)
}
JavaScript, JQuery, CSS,

javascript,jquery,css,

1

Ответов: 3


2 принят

Вы можете передать дополнительный параметр, чтобы отметить последний элемент, а затем вызвать функцию внутри playAudio:

playAudio

ручка

или, возможно, самый простой способ - вызвать функцию напрямую:

removeHighlight

прямо до конца playPattern ().

Кроме того, надеюсь, вы знаете, что clearTimeout () всегда уничтожает ваш первый вызов, если не объявлять переменную внутри области forEach.


1

Создайте массив обещаний, которые разрешают playPatternсобытие звуковых элементов . Затем используйте, function playPattern (arr, done) { var patternIDs = { 0: 'blue', 1: 'green', 2: 'red', 3: 'yellow' } var iteratee = function (item, i, cb) { setTimeout(function (id) { playAudio(id) cb() }, 1000 * i, patternIDs[arr[i]]) } async.eachOf(arr, iteratee, done) } чтобы очистить блики, когда все обещания разрешены.

playPattern

1

setTimeoutФункция является асинхронным, и поэтому ваша playPatternфункция будет фактически вернуться до любого из playAudioзадержанных вызовов были сделаны.

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

Мне нравится использовать замечательную асинхронную библиотеку для этого типа вещей, но вы также можете добиться чего-то подобного с обещаниями. С его помощью вы переписываете свою playPatternфункцию следующим образом:

gamePlay

Теперь, когда вы вызываете playPattern, вы можете передать функцию как второй аргумент, который будет вызываться только после завершения всех завершенных setTimeoutвызовов. Вы можете переписать свою gamePlayфункцию следующим образом:

function gamePlay () {
  var testArr = [3, 2, 0, 1, 3]

  playPattern(testArray, removeHighlight)
}
JavaScript, JQuery, CSS,
Похожие вопросы