节点JS代码执行

时间:2014-03-30 15:31:11

标签: javascript node.js asynchronous

在阅读了许多关于如何在节点js中编写正确代码的文章之后,我现在有点恼火。

我想对这些陈述中的每一个是否正确进行一些澄清:

  • 代码同步执行
  • for循环或while循环等将异步执行
  • 通过以下代码执行不正确的异步:

function doSomething(callback) {
    // doing some code

    // much much code

    callback();
}

人们说这不能正常工作的原因是代码是异步执行的,所以回调不会在代码结束时触发,它将立即执行。

因此,例如,如果您通过执行某些操作来填充某个对象,并且您希望通过回调发回该完整对象,则它不起作用,因为它将同时执行。

2 个答案:

答案 0 :(得分:2)

不,forwhile循环在Node.js中是同步的。

您的doSomething函数示例是否有效取决于您在调用callback()之前是否正在调用异步函数。如果您正在进行异步调用,那么您需要推迟调用callback(),直到完成异步调用。如果你只是进行同步调用,那么你不需要使用回调,你的函数可以同步返回结果。

答案 1 :(得分:1)

node.js中的代码不是标准异步的。您一个接一个地拨打的电话仍将一个接一个地执行。 for或while循环仍然会以这种方式阻塞主代码。

但是,您可以通过process.nextTick(回调)传递稍后将执行的函数。此方法将向事件队列添加一个函数,node.js在内部处理该函数。只有在任何其他阻塞代码被扩展后才会执行此操作。一个例子:

function doWork(callback) {
    //Do some work here, for instance a for loop that might take a while

    callback(workReslt);
}

function workDone(workResult) {
    //Process the result here
}

function startWork() {
    process.nextTick(doWork(workDone));
}

当服务器再次通过事件循环时,这将执行doWork()。这样,startWork()函数不会阻塞主代码。

但是,node.js中的大多数模块已经实现了这一点。数据库和文件访问通常是非阻塞的,它只需在完成它的工作时触发回调。

如果你真的必须执行繁重的异步计算(或者也许某些IO已经没有模块),你可以查看异步模块,它有一个很好的教程:{{3} }

至于编码惯例,请这样考虑。如果您知道该操作需要花费时间,那么您应该将其设置为异步(通过我先提到的方法或异步模块)。像这样的动作通常与I / O有关,这通常也意味着已经有一个异步模块。但是,到目前为止我遇到的大多数情况都没有要求过。

来源: http://justinklemm.com/node-js-async-tutorial/