У меня есть длинная функция в JavaScript, и я собираюсь приостановить ее в некоторых моментах. Я знаю, что могу сделать это, используя setTimeout(myFunction, 100)
и clearTimeout()
. Но, как я знаю, после использования setTimeout(myFunction, 100)
моя функция будет выполняться с первой строки через 100 миллисекунд, а затем каждые 100 миллисекунд. Мне интересно, могу ли я приостановить свою функцию в строке 50, а затем возобновить ее сразу после этой строки, которая равна 51. Возможно ли это?
Как приостановить функцию в JavaScript?
Ответы (2)
Вот один из способов сделать это. Убедитесь, что все переменные, которые вам всегда нужны, объявлены во внешней функции. Из-за правил области действия Javascript они будут доступны в каждой подфункции.
function paused() {
// Define variables you'll need throughout the function.
var var1, var2, var3;
// First part of the function
function part1() {
// 50 lines
}
// Second part of the function
function part2() {
// 50 lines
}
setTimeout(part1, 0);
setTimeout(part2, 100);
}
Предположим, что есть много частей, тайм-ауты можно даже зациклить:
function paused() {
// Define variables you'll need throughout the function.
var var1, var2, var3;
// All function parts.
var parts = [
function() {
// 50 lines
},
function() {
// 50 lines
},
function() {
// 50 lines
}
// More?
];
for (var i = 0; i < parts.length; i++) {
setTimeout(parts[i], i * 100);
}
}
Обязательно будьте осторожны при использовании this
, так как внутренние функции перепривязывают его.
Обратите внимание, что глобальная функция всегда будет выполнять приостановленные части по порядку, независимо от того, занимает ли каждая отдельная часть более 100 мс, из-за того, как работает очередь событий Javascript. Когда очередь событий видит, что несколько setTimeouts могут быть выполнены одновременно, приоритет отдается первому из них.
var function paused
, безусловно, интересно попробовать расшифровать как английский, но это неверный JavaScript. :) (у вас есть дополнительные var
в начале каждого из ваших блоков кода)
- person tckmn; 19.10.2014
Вы путаете setTimeout
и setInterval
.
Однако это совершенно невозможно.
Вместо этого вам нужно разбить его на две функции, и вызвать вторую из первой с помощью setTimeout
.
В зависимости от того, что вы на самом деле пытаетесь сделать, обещания, вероятно, помогут.
setTimeout
и setInterval
? То, что хочет сделать ОП, не является невозможным. Вы можете использовать генераторы, чтобы приостановить функцию на полпути. Я не понимаю, как обещания могут помочь. Этот ответ не добавляет ничего ценного. Вместо этого должен быть комментарий.
- person Aadit M Shah; 19.10.2014
setTimeout
и setInterval
.
- person GramThanos; 19.10.2014
setTimout(foo, 100)
внутри функции foo
, то вы вызываете setTimeout
рекурсивно, что означает, что foo
будет вызываться каждые 100 миллисекунд. Это определенно не то же самое, что setInterval
. Однако ОП должен был уточнить какой-то код.
- person Aadit M Shah; 19.10.2014
yield
по регистру переключателей. - person Herrington Darkholme   schedule 19.10.2014setTimeout
, вернется и продолжит работу.setTimeout
только графики. Сам он ничего не вызывает и не выполняет. Если другой код написан, чтобы предположить, что две части завершены, потому что функция возвратила, это становится ошибкой. Это не делает ответы неправильными. Это подчеркивает необходимость изучения того, как работает цикл обработки событий Javascript, что такое асинхронное программирование, почему в JS нет функции sleep(). - person Paul   schedule 24.10.2014