我正在编写一个节点后端,我有点困惑,我应该如何处理异步函数。我读过有关process.nextTick()的内容,但我应该多久使用一次。我的大多数代码都基于回调,比如数据库调用,它们本身是异步的。但我也有一些我自己的功能,应该是异步的。
那么哪一个是异步函数的好例子?
function validateUser1(user, callback) {
process.nextTick(function() {
//validate user, some regex and stuff
callback(err, user);
});
}
function validateUser2(user, callback) {
//validate user, some regex and stuff
process.nextTick(callback, err, user);
}
function validateUser3(user, callback) {
process.nextTick(function() {
//validate user, some regex and stuff
process.nextTick(callback, err, user);
});
}
我不知道是否应该将所有内容包装在process.nextTick中,还是只包装回调?或两者?
总的来说,node.js的想法是编写许多小函数而不是大函数,并异步调用它们来阻止其他事件,对吗?
答案 0 :(得分:2)
如果你只有CPU代码(没有I / O),你应该尝试尽可能远。避免异步和微小的函数,这些函数会不必要地分割代码。
抓住机会,尽可能编写干净,可读的线性代码。仅在绝对必要时才恢复为异步,例如流I / O(文件或网络)。
考虑一下。即使你有1000多行JS代码,它仍然会以极快的速度执行。你真的不需要分割它(除非证明太麻烦,例如非常深的循环,但你必须先测量它)!
如果你不首先测试线性代码并且实际上看到你需要对其进行分段,那么你最终会过早优化,这对可维护性来说是一件坏事。
我真的马上就去了:
function validateUser1(user, callback) {
//validate user, some regex and stuff
callback(err, user);
}
如果可能的话,完全删除该功能(但这是你编写其余代码的方法)。
另外,如果您真的不需要,请不要使用nextTick()
。我已经实现了一个具有许多TCP / IP套接字,数据库连接,日志记录,文件读取和大量I / O的云服务器,但是 NOT ONCE 我使用了nextTick()
和它运行得非常顺利。
答案 1 :(得分:1)
process.nextTick()将在继续事件循环之前执行回调。如果你传递给process.nextTick()的回调是像加密,计算PI等那样昂贵的CPU,那么这将阻止你的线程并阻止传入的连接被处理。
根据我的理解,您尝试通过将函数传递给process.nextTick()来使函数异步。这不是它的工作原理。 当您将某些内容传递给process.nextTick()时,它将在下次执行eventloop之前执行。这不会使您的函数无阻塞,因为您执行的函数仍在主线程中运行。只有I / O操作可以是非阻塞的。
因此,如果使用process.nextTick()包装CPU密集型函数或者立即执行它们,则无关紧要。
如果您想了解更多背景信息,请参阅以下资源:https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/#process-nexttick
答案 2 :(得分:0)
我仍然对提供的答案感到困惑。 我在Lynda.com上观看了有关NodeJS(高级NodeJS)的短期课程。 该人员提供了以下使用process.nextTick()
的示例function hideString(str, done) {
process.nextTick(()=> {
done(str.replace(/[a-zA-Z]/g, 'X'))
})
}
hideString("Hello World", (hidden) => {
console.log( hidden );
});
console.log('end')
如果不使用,将首先打印console.log('end')。不同步。 我将其理解为编写异步代码,您将需要process.nextTick。 尚不清楚如何在没有流程的情况下在前端使用JS编写异步代码。下一个Tick()