Node.js异步函数,process.nextTick()

时间:2017-06-11 09:03:13

标签: javascript node.js asynchronous

我正在编写一个节点后端,我有点困惑,我应该如何处理异步函数。我读过有关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的想法是编写许多小函数而不是大函数,并异步调用它们来阻止其他事件,对吗?

3 个答案:

答案 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()