JavaScript睡眠

Dia*_*ath 8 javascript sleep

是的,我知道 - 这个问题有成千上万的答案.请不要告诉我setTimeout方法,因为 - 是的,一切皆有可能,但不如使用sleep()方法那么容易.

例如:

function fibonacci(n) {
    console.log("Computing Fibonacci for " + n + "...");
    var result = 0;

    //wait 1 second before computing for lower n
    sleep(1000);
    result = (n <= 1) ? 1 : (fibonacci(n - 1) + fibonacci(n - 2));

    //wait 1 second before announcing the result
    sleep(1000);
    console.log("F(" + n + ") = " + result);

    return result;
}
Run Code Online (Sandbox Code Playgroud)

如果你知道如何使用相同的结果setTimeout- 告诉我;)fibanacci是非常容易的任务,因为不超过2次递归,但是如何进行n次递归(如fib(1)+ fib(2)+). .+ fib(n))并在每个"+"之后睡觉?不,睡觉会轻松多了.

但我仍然无法实现它的实例.while (curr - start < time) { curr = (...) }是棘手的,但它不会工作(只是停止我的浏览器,然后立即抛出所有控制台日志).

小智 33

问题是询问如何sleep()在JavaScript中实现,对吧?

function sleep(ms) {
  var start = new Date().getTime(), expire = start + ms;
  while (new Date().getTime() < expire) { }
  return;
}
Run Code Online (Sandbox Code Playgroud)

我刚刚测试过它:

console.log('hello');
sleep(5000);
console.log('world');
Run Code Online (Sandbox Code Playgroud)

适合我.

(作为一个元评论:我在这里登陆是因为我特别需要这个功能.当你需要在等待一个值时阻塞时,会出现这样的需求.即使在JavaScript中也是如此.)

  • 另一方面,同步`sleep()`可能非常有用,例如,在存在可能(但尚未存在)的长时间运行的JS任务的情况下测试一些深奥的`setInterval()/ clearInterval()`行为.这是回答"如何在JS中睡觉()"这一问题的唯一答案.并不是说我认为这是大多数人想要的答案,但这是因为大多数人要求'sleep()`实际上并不想要'sleep()`. (2认同)

Jak*_*kob 20

我不完全明白你在问什么,但我会回答这一部分:

如果你知道如何使用setTimeout获得相同的结果 - 告诉我

根本区别在于sleep(在许多其他语言中使用)是同步的,而setTimeout(和许多其他JavaScript概念,例如AJAX)是异步的.因此,为了重写您的功能,我们必须考虑到这一点.主要是,我们必须使用回调来获取"返回值",而不是实际的返回语句,因此它将像这样使用:

fibonacci(7, function(result) {
  // use the result here..
});
Run Code Online (Sandbox Code Playgroud)

那么,至于实施:

function fibonacci(n, callback) {
  console.log("Computing Fibonacci for " + n + "...");
  var result = 0;

  var announceAndReturn = function() {
    setTimeout(function() {
      // wait 1 second before announcing the result
      console.log("F(" + n + ") = " + result);
      callback(result); // "returns" the value
    }, 1000);
  };

  // wait 1 second before computing lower n
  setTimeout(function() {
    if (n <= 1) {
      result = 1;
      announceAndReturn();
    }
    else {
      var resultsLeft = 2;

      var handler = function(returned) {
        result += returned;
        resultsLeft--;
        if (resultLeft == 0)
          announceAndReturn();
      }

      fibonacci(n-1, handler);
      fibonacci(n-2, handler);
    }
  }, 1000);
}
Run Code Online (Sandbox Code Playgroud)

我还想指出,,这不是一个比使用更容易的解决方案sleep.为什么?因为这段代码是异步的,而且比大多数人习惯的同步代码简单得多.以这种方式开始思考需要练习.

好处?它允许您编写优于同步对应的非阻塞算法.如果您之前没有听说过Node.js,可以查看它以进一步了解它的好处.(许多其他语言也有用于处理异步IO的库,但只要谈论JavaScript ......)