У меня есть длинная функция в JavaScript, и я остановлюсь на ней в некоторых случаях. Я знаю, что могу это сделать, используя setTimeout(myFunction, 100)
и clearTimeout()
. Но, как я знаю, после использования setTimeout(myFunction, 100)
моя функция будет выполняться с первой строки через 100 миллисекунд, а затем каждые 100 миллисекунд. Мне интересно, могу ли я приостановить свою функцию на своей строке 50, а затем возобновить ее сразу после этой строки, которая равна 51. Возможно ли это?Как приостановить функцию в JavaScript?
ответ
Вот один из способов сделать это. Убедитесь, что все переменные, которые вы всегда должны быть областью видимости, объявляются во внешней функции. Из-за правил области 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' в начале каждого из ваших кодовых блоков) – Doorknob
, если какая-либо часть занимает более 100 мс для выполнения, глобальная функция будет ломаться. –
Он мог вставлять каждый setTimeout в другой. – GramThanos
Вы вводите в заблуждение setTimeout
и setInterval
.
Однако это абсолютно невозможно.
Вместо этого вам необходимо разбить его на две функции и вызвать второй из первого, используя setTimeout
.
В зависимости от того, что вы на самом деле пытаетесь сделать, обещания, вероятно, помогут.
Как OP запутывает 'setTimeout' и' setInterval'? То, что OP хочет сделать, не является невозможным. Вы можете использовать генераторы для приостановки функции на полпути. Я не понимаю, как могут помочь обещания. Этот ответ не добавляет ничего ценного. Вместо этого это должен быть комментарий. –
OP использовал тег setinterval. Возможно, это можно исправить. –
@Aadit M Shah - Хорошо, если вы прочтете его снова, вы увидите, что он вводит в заблуждение 'setTimeout' и' setInterval'. – GramThanos
Просьба предоставить нам некоторый код, чтобы мы могли предоставить более качественные ответы. –
Вы также можете увидеть веб-работников, если вы просто делаете расчеты. http://www.html5rocks.com/en/tutorials/workers/basics/ – GramThanos
Я думаю, [функция *] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/ функция *) - это то, что вы хотите. Для es5-совместимой функции вы можете высмеивать 'yield' в случае коммутатора. –