как сделать сон в JavaScript?

Оператор this может упростить вашу жизнь:

var Y = function(f) {
    return (function(g) {
        return g(g);
    })(function(h) {
        return function() {
            return f.apply(h(h), arguments);
        };
    });
};

Тогда вы избегаете дополнительной функции:

var fac = Y(function(n) {
    return n == 0 ? 1 : n * this(n - 1);
});

Наконец, вы вызываете fac(5).

5
задан Jin Yong 24 June 2009 в 06:00
поделиться

8 ответов

I Have the Hat дал правильный намек.

16
ответ дан 18 December 2019 в 06:03
поделиться

Попытка

setTimeout(function() { return true; }, 10000);

Первый аргумент ожидает функцию. Это по памяти; Я не проверял это.

Редактировать: Что сказал Гамбо ... поздно здесь ... не уверен, о чем я думал.

5
ответ дан 18 December 2019 в 06:03
поделиться

Задержка не произойдет до тех пор, пока JavaScript не вернет управление браузеру, поэтому ваша строка 4 будет выполняться до начала setTimeout.

Вы должны делать все, чтобы все происходило на основе событий.

1
ответ дан 18 December 2019 в 06:03
поделиться

setTimeout запускает отдельный поток выполнения в интерпретаторе JavaScript. Вам нужно передать ему функцию и спроектировать свои сценарии таким образом, чтобы функция, выполняемая setTimeout, продолжалась с того места, где была остановлена ​​вызывающая функция, тем самым имитируя сон.

2
ответ дан 18 December 2019 в 06:03
поделиться

Могу я предложить это как общее решение:

  function sleep (ms, args, obj) {
    /* Called at the top of a function to invoke a delay in processing that
       function

       Returns true if the function should be executed, and false if the sleep
       timer is activated. 

       At the end of the sleep tiemout, the calling function is re-called by
       calling it with "apply (obj, args || [])".
    */

    var caller = sleep.caller;
    if (caller.sleepTimer) { 
      /* if invoked from timeout function, delete timer and return false */
      delete caller.sleepTimer;
      return true;
    }

    /* Create timer and re-call caller at expiry */
    caller.sleepTimer = window.setTimeout (function () {
      caller.apply (obj || null, args || []);
    },ms);

    return false;
  }    

Примеры использования:

function delayed () {
  if (!sleep (5000)) return;  

  document.body.innerHTML += "<p>delayed processing</p>";
}

function delayed_args (a, b) {
  if (!sleep (10000, arguments)) return;  

  document.body.innerHTML += "<p>args : (" + a + ", " + b + ")</p>";
}

function delayed_method_args (a,b) {
  if (!sleep (20000, arguments, this)) return;  

  document.body.innerHTML += "<p>method_args " + this + " (" + a + ", " + b + ")</p>";
}

Протестировано в Opera и Firefox 3.0

0
ответ дан 18 December 2019 в 06:03
поделиться
    1 var chkResult = Validation();
    2 alert("wait ten seconds, then press ok");
    3       
    4 document.getElementById('abc').innerHTML = chkResult;

Предыдущий код делегирует задачу ожидания параллельному процессору. Это немного запутано, потому что для этого стиля потоковой передачи вам придется использовать DSL.

3
ответ дан 18 December 2019 в 06:03
поделиться

Javascript должен разделять поток с браузером, поэтому пауза Вы хотите, чтобы браузер выглядел так, как если бы это было возможно, на 10 секунд. Это делают такие функции, как «предупреждение» и «подсказка». Для этого они являются злом, поскольку одно предупреждение в цикле может поставить весь браузер на колени, и единственный выход - принудительно закрыть его.

Способом решения этой проблемы является парадигма, основанная на событиях. Javascript имеет функции первого класса, поэтому их можно передавать как значения для «обратных вызовов», которые вы можете назначать определенным событиям.

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

, если вы хотите узнать больше, взгляните на этот вопрос: Чем отличается графический интерфейс и поток игровых программ с веб-программами

0
ответ дан 18 December 2019 в 06:03
поделиться

but this way, your line line will execute BEFORE line 4

0
ответ дан 18 December 2019 в 06:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: