在阅读了许多关于如何在节点js中编写正确代码的文章之后,我现在有点恼火。
我想对这些陈述中的每一个是否正确进行一些澄清:
→
function doSomething(callback) {
// doing some code
// much much code
callback();
}
人们说这不能正常工作的原因是代码是异步执行的,所以回调不会在代码结束时触发,它将立即执行。
因此,例如,如果您通过执行某些操作来填充某个对象,并且您希望通过回调发回该完整对象,则它不起作用,因为它将同时执行。
答案 0 :(得分:2)
不,for
和while
循环在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有关,这通常也意味着已经有一个异步模块。但是,到目前为止我遇到的大多数情况都没有要求过。