我是节点的新手,并试图围绕回调以及如何使用它们。如果我理解正确,你可以使用回调作为解锁代码的方法,这样可能需要一段时间才能执行的函数不会妨碍之后发生的任何事情。我正在尝试一个我自己编写的例子,无法让它正常工作。
在此示例中,递归函数将需要几秒钟才能完成。如何编写回调,以便系统控制台记录1,然后是2,然后是草书函数的答案,以表明递归函数后来没有阻塞任何内容?
return 0;
答案 0 :(得分:1)
node.js没有内置的方法使同步代码突然变为异步或非阻塞。 node.js使用回调来通知实现中实际异步的操作的完成或状态,例如异步文件或磁盘I / O或网络。
因此,简而言之,你不能只是为你的函数添加一个回调,并神奇地使它成为异步或非阻塞。
要使其成为非阻塞,您必须将其移动到另一个进程并让该进程运行该操作,然后让该进程与此进程异步通信(通过某些进程间通信)。其他进程可以是另一个node.js进程,也可以是任何其他语言的应用程序。
答案 1 :(得分:1)
不是它的工作原理。首先,JavaScript是单线程的。这意味着,当处理器忙于处理JavaScript时,您无法同时执行更多JavaScript。回调所避免的阻塞是人们通常会等待其他事情的时间:磁盘,数据库,网络,远程客户端,另一个进程,用户输入,延迟函数调用......
这种方式的工作方式是:你说你想要读一个文件。您可以使用fs.readFile
:
fs.readFile('file.txt', 'utf8', fileDataReceived);
我们定义一个回调(一个在其他东西之后回调的函数)来打印结果:
function fileDataReceived(err, txt) {
if (err) {
console.error(err);
} else {
console.log(txt);
}
}
Node将开始读取文件,然后在代码继续执行时在后台等待结果。
当文件读取结束时,您传入的回调(fileDataReceived
)将被放在执行堆栈上。
当您的代码完全执行(所有被调用的函数退出)时,Node会检查执行堆栈上是否有任何内容。如果有,则调用它。
在JavaScript中执行其他操作时,您无法执行Fibonacci序列。您可以在执行其他操作时要求另一个进程执行Fibonacci序列,然后在结果可用时通知您。
答案 2 :(得分:1)
你现在所拥有的不是异步的,所以执行将阻塞,直到recursive(42)
调用完成才能打印2.我可以想到的基本JavaScript和Node的异步回调的最简单的例子是使用setTimeout
或setInterval
函数。
你可以用你的例子做到这一点的一种方式是:
function recursive(n) {
if(n <= 2) {
return 1;
} else {
return recursive(n - 1) + recursive(n - 2);
}
};
function callback() {
console.log(recursive(42))
}
console.log(1);
setTimeout(callback, 0);
console.log(2);
这将做什么
callback
在0ms后立即异步调用(立即执行)recursive(42)
(由callback
调用)的结果记录到控制台