2014-10-19 2 views
4

У меня есть длинная функция в JavaScript, и я остановлюсь на ней в некоторых случаях. Я знаю, что могу это сделать, используя setTimeout(myFunction, 100) и clearTimeout(). Но, как я знаю, после использования setTimeout(myFunction, 100) моя функция будет выполняться с первой строки через 100 миллисекунд, а затем каждые 100 миллисекунд. Мне интересно, могу ли я приостановить свою функцию на своей строке 50, а затем возобновить ее сразу после этой строки, которая равна 51. Возможно ли это?Как приостановить функцию в JavaScript?

+1

Просьба предоставить нам некоторый код, чтобы мы могли предоставить более качественные ответы. –

+0

Вы также можете увидеть веб-работников, если вы просто делаете расчеты. http://www.html5rocks.com/en/tutorials/workers/basics/ – GramThanos

+3

Я думаю, [функция *] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/ функция *) - это то, что вы хотите. Для es5-совместимой функции вы можете высмеивать 'yield' в случае коммутатора. –

ответ

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 могут быть выполнены одновременно, приоритет должен быть первым.

+3

'var function paused', безусловно, интересно попробовать расшифровать как английский, но это недействительный JavaScript. :) (у вас есть дополнительный 'var' в начале каждого из ваших кодовых блоков) – Doorknob

+2

, если какая-либо часть занимает более 100 мс для выполнения, глобальная функция будет ломаться. –

+0

Он мог вставлять каждый setTimeout в другой. – GramThanos

0

Вы вводите в заблуждение setTimeout и setInterval.

Однако это абсолютно невозможно.

Вместо этого вам необходимо разбить его на две функции и вызвать второй из первого, используя setTimeout.

В зависимости от того, что вы на самом деле пытаетесь сделать, обещания, вероятно, помогут.

+0

Как OP запутывает 'setTimeout' и' setInterval'? То, что OP хочет сделать, не является невозможным. Вы можете использовать генераторы для приостановки функции на полпути. Я не понимаю, как могут помочь обещания. Этот ответ не добавляет ничего ценного. Вместо этого это должен быть комментарий. –

+0

OP использовал тег setinterval. Возможно, это можно исправить. –

+0

@Aadit M Shah - Хорошо, если вы прочтете его снова, вы увидите, что он вводит в заблуждение 'setTimeout' и' setInterval'. – GramThanos

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

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