JavaScript休眠

5 浏览
0 Comments

JavaScript休眠

这个问题已经在这里有答案了

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;
}

如果你知道如何使用setTimeout获得相同的结果 - 告诉我;) 斐波那契数列是相当简单的任务,因为不会有超过2个递归,但是如何在每个“+”后睡眠 n-递归(例如fib(1)+ fib(2)+ .. + fib(n))?呃,sleep会容易得多。

但是,我仍然无法找到可行的实现示例。while(curr-start<time){curr=(...)} 很棘手,但它不起作用(只是停止我的浏览器,然后一次性抛出所有控制台日志)。

admin 更改状态以发布 2023年5月22日
0
0 Comments

我不完全明白你的问题,但我会回答其中一部分:

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

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

fibonacci(7, function(result) {
  // use the result here..
});

因此,对于实现:

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);
}

我还想指出,不,这不比使用sleep更容易。为什么?因为这段代码是异步的,对于大多数人而言,同步代码简单得多。需要实践才能开始以这种方式思考。

好处是什么?它允许你编写非阻塞算法,优于它们的同步对应物。如果你以前没有听说过Node.js,你可以去了解一下,以进一步了解其中的好处。(许多其他语言也有处理异步IO的库,但只要我们谈论JavaScript..)

0
0 Comments

这个问题是在问如何在JavaScript中实现 sleep() 函数,是吗?

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

我刚刚尝试测试了一下:

console.log('hello');
sleep(5000);
console.log('world');

对我来说是有效的。

(作为元注释:我来到这里是因为我有一个特殊需要这个函数的需求。当你需要阻止等待值时,这些需求确实会出现,即使在JavaScript中也是如此。)

0