Первая форма, которую вы перечислите, работает, так как она будет оценивать строку в конце delay
. Использование eval()
, как правило, не является хорошей идеей, поэтому вам следует избегать этого.
Второй метод не работает, поскольку вы немедленно выполняете объект функции с помощью оператора функции ()
. Что происходит, так это то, что playNote
выполняется немедленно, если вы используете форму playNote(...)
, поэтому в конце задержки ничего не произойдет.
Вместо этого вы должны передать анонимную функцию setTimeout , поэтому правильная форма:
setTimeout(function() { playNote(currentaudio.id,noteTime) }, delay);
Обратите внимание, что вы передаете setTimeout
целое функциональное выражение, поэтому он будет удерживать анонимную функцию и выполнять ее только в конце задержки.
Вы также можете передать setTimeout
ссылку, так как ссылка не выполняется немедленно, но затем вы не можете передавать аргументы:
setTimeout(playNote, delay);
Примечание:
Для повторных событий вы можете использовать setInterval()
, и вы можете установить setInterval()
на переменную и использовать переменную, чтобы остановить интервал с помощью clearInterval()
.
Вы говорите, что используете setTimeout()
в цикле for
. Во многих ситуациях лучше использовать setTimeout()
в рекурсивной функции. Это связано с тем, что в цикле for
переменные, используемые в setTimeout()
, не будут такими переменными, какими они были, когда начался setTimeout()
, но переменные, как они есть после задержки при запуске функции.
Просто используйте рекурсивную функцию, чтобы обойти эту проблему.
// Set original delay
var delay = 500;
// Call the function for the first time, to begin the recursion.
playNote(xxx, yyy);
// The recursive function
function playNote(theId, theTime)
{
// Do whatever has to be done
// ...
// Have the function call itself again after a delay, if necessary
// you can modify the arguments that you use here. As an
// example I add 20 to theTime each time. You can also modify
// the delay. I add 1/2 a second to the delay each time as an example.
// You can use a condition to continue or stop the recursion
delay += 500;
if (condition)
{ setTimeout(function() { playNote(theID, theTime + 20) }, delay); }
}
Хорошо, я забыл добавить код, чтобы получить и снять глобальную блокировку интерпретатора для некоторого класса функций. Извините за глупый вопрос.
Имейте веру в детей Python.