节点中的基本回调帮助

basic callback help in node

本文关键字:回调 帮助 节点      更新时间:2023-09-26

我对node是个新手,正试图了解回调以及如何使用它们。如果我的理解是正确的,你可以使用回调来解锁你的代码,这样可能需要一段时间才能执行的函数就不会妨碍后面的任何东西。我正在尝试一个我自己编造的例子,但却无法正确地发挥作用。

在本例中,递归函数需要几秒钟才能完成。如何编写回调,以便系统控制台记录1,然后记录2,然后记录草书函数的答案,以表明递归函数之后没有阻塞任何内容?

function recursive(n) {
  if(n <= 2) {
    return 1;
  } else {
    return recursive(n - 1) + recursive(n - 2);
  }
};
console.log(1);
console.log(recursive(42))

console.log(2);

node.js没有内置的方法可以使同步代码突然变得异步或非阻塞。node.js使用回调来通知在其实现中实际上是异步的操作的完成或状态,例如异步文件或磁盘I/O或网络。

因此,简而言之,您不能只向函数添加回调,然后神奇地使其异步或非阻塞。

为了使其不阻塞,您必须将其移动到另一个进程,让该进程运行操作,然后让该进程异步地与该进程通信(通过一些进程间通信(。另一个进程可以是另一个node.js进程,也可以是任何其他语言的应用程序。

不是如何工作的。首先,JavaScript是单线程的。这意味着,当处理器忙于处理JavaScript时,您不能同时执行更多的JavaScript。回调所避免的阻塞是指通常等待其他事情的时间:磁盘、数据库、网络、远程客户端、另一个进程、用户输入、延迟的函数调用。。。

它的工作方式是:你说你想,比如说,读一个文件。您使用fs.readFile来实现:

fs.readFile('file.txt', 'utf8', fileDataReceived);

我们定义了一个回调(一个在其他事情之后被调用的函数(来打印结果:

function fileDataReceived(err, txt) {
  if (err) {
    console.error(err);
  } else {
    console.log(txt);
  }
}

节点将开始读取文件,然后在代码继续执行时在后台等待结果。

当文件读取结束时,您传入的回调(fileDataReceived(将被放入执行堆栈。

当您的代码完全执行(所有调用的函数都退出(时,Node会检查执行堆栈上是否有任何内容。如果存在,则会调用它。

在JavaScript中执行其他操作时,不能执行斐波那契序列。您可以让另一个进程在执行其他操作时执行斐波那契序列,然后当结果可用时,它会通知您。

您现在拥有的不是异步的,因此执行将被阻止,直到recursive(42)调用完成后再打印2。我能想到的使用基本JavaScript和Node的异步回调的最简单例子是使用setTimeoutsetInterval函数的东西。

你可以用你的例子做到这一点的一种方法是这样的:

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

这将做什么是

  1. 将1登录到控制台
  2. 计划在0ms后异步调用callback(因此立即调用(
  3. 将2登录到控制台
  4. 一旦函数执行完毕,将recursive(42)(由callback调用(的结果记录到控制台