递归函数是运行 in Javascript,如何执行回调函数?

How to execute callback function while resursive function is running in Javascript?

无法运行回调函数,而递归函数是运行ning?

递归斐波那契函数和setInterval()的示例代码

'use strict';

function fibo(x) {
  if (x === 0) {
    console.info('fibo( ' + x + ' ) == 0');
    return 0;
  } else if (x === 1) {
    console.info('fibo( ' + x + ' ) == 1');
    return 1;
  }
  return fibo(x-2) + fibo(x-1);
};

fibo(10);

setInterval(() =>{console.info('hello')},10);

执行此代码,在 fibo(10) 完成其工作后设置 Interval 运行。

如何在 fibo() 运行ning 时显示 'hello' 日志? 递归函数是运行ning时是否可以切入回调函数?

How to display 'hello' log while fibo() is running?

因为 fibo 是同步的,所以在正常情况下你不能。 JavaScript 以服务于作业队列的线程为基础工作。虽然一个作业正在 运行ning,但没有其他作业可以在该线程上 运行(例如 setInterval 排队等待调用回调的作业)。每个 realm(松散地,全局环境)只有一个线程,并且在所有主要环境(包括浏览器)中只有一个主线程。你可以创造其他人,但他们有自己的环境。

您有两个选择:

  1. 使 fibo 异步,每次调用它都会安排另一个作业中的下一个调用(例如通过 setTimeout)。
  2. 制作 fibo 生成器函数,并为值重复调用它,在这些调用中穿插 setInterval 回调。
  3. 使用工作线程。

由于您的 setInterval 代码和 fibo 代码不共享任何数据,因此使用工作线程很有意义:

main.js:

'use strict';

function fibo(x) {
  if (x === 0) {
    console.info('fibo( ' + x + ' ) == 0');
    return 0;
  } else if (x === 1) {
    console.info('fibo( ' + x + ' ) == 1');
    return 1;
  }
  return fibo(x-2) + fibo(x-1);
};

new Worker("worker.js");
fibo(10);

worker.js:

setInterval(() =>{console.info('hello')},10);

如果他们共享数据,您可以使用 shared memory,但要注意同步问题。