节点中的基本回调帮助
basic callback help in node
我对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的异步回调的最简单例子是使用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);
这将做什么是
- 将1登录到控制台
- 计划在0ms后异步调用
callback
(因此立即调用( - 将2登录到控制台
- 一旦函数执行完毕,将
recursive(42)
(由callback
调用(的结果记录到控制台
- AngularJS:我可以跳过函数参数回调吗
- 要求未定义JS回调参数
- MeteorJS:在带有回调的vzaar api上正确使用wrapAsync
- 自引用回调
- 测试Angular Service解决错误回调中的promise
- 如何将一个JavaScript函数回调为多个函数
- JavaScript回调函数
- 用于回调的javascript参数
- 将json回调数据转换为日期
- 承诺在非节点式回调上使用Bluebird
- 如何在回调函数中执行流
- 回调函数中传递参数的困难(Google Map API Markers)
- Soundcloud Javascript SDK 3.0-回调无法读取属性'connectCallback
- 如何使用jqueryAJAX从页面中回调多个变量
- 循环函数(Javascript回调帮助)
- 节点中的基本回调帮助
- 需要一些帮助,回调数组从文本区域在谷歌脚本
- 帮助理解函数回调
- JS:帮助我理解为什么我不能使用这个预定义的函数作为回调
- 如何在jQuery的帮助下创建回调优先队列