在node.js中是异步还是不异步?
我还在学习node.js的诀窍,我只是想弄清楚我应该推迟什么,应该执行什么 我知道一般来说还有其他与这个主题相关的问题,但我担心没有一个更相关的例子,我很难“理解” 我的一般理解是,如果正在执行的代码非常重要,那么异步它可能是一个好主意,以避免它阻塞其他人的会话。很明显,事情远不止这些,回调被提到了很多,我不是100%理解为什么你不同步所有的东西。我还有一些路要走 下面是我在express.js应用程序中编写的一些基本代码:在node.js中是异步还是不异步?,node.js,mongodb,asynchronous,express,mongoose,Node.js,Mongodb,Asynchronous,Express,Mongoose,我还在学习node.js的诀窍,我只是想弄清楚我应该推迟什么,应该执行什么 我知道一般来说还有其他与这个主题相关的问题,但我担心没有一个更相关的例子,我很难“理解” 我的一般理解是,如果正在执行的代码非常重要,那么异步它可能是一个好主意,以避免它阻塞其他人的会话。很明显,事情远不止这些,回调被提到了很多,我不是100%理解为什么你不同步所有的东西。我还有一些路要走 下面是我在express.js应用程序中编写的一些基本代码: app.get('/directory', function(req,
app.get('/directory', function(req, res) {
process.nextTick(function() {
Item.
find().
sort( 'date-modified' ).
exec( function ( err, items ){
if ( err ) {
return next( err );
}
res.render('directory.ejs', {
items : items
});
});
});
});
我在这里使用process.nextTick()
对吗?我的理由是,由于这是一个数据库调用,因此必须完成一些实际工作,而这类工作可能会减慢活动会话的速度。还是错了
其次,我有一种感觉,如果我延迟数据库查询,那么它应该在回调中,并且在接收回调响应的条件下,我应该让实际的页面呈现同步进行。我之所以假设这一点,是因为从我看到的一些例子来看,这似乎是一种更常见的格式——如果这是一个正确的假设,有人能解释为什么会这样吗
谢谢 在本例中,您使用它是错误的,因为
.exec()
已经是异步的(您可以通过它接受回调作为参数这一事实来判断)
公平地说,nodejs中需要异步的大部分内容已经是
至于页面呈现,如果您需要数据库的结果来呈现页面,而这些结果是异步到达的,那么您就不能真正同步呈现页面。一般来说,最好的做法是使所有可以呈现的内容都是异步的,而不是依赖同步函数。。。在大多数情况下,这类似于
readFile
与readFileSync
。在您的示例中,您没有与i/o同步执行任何操作。您仅有的同步代码是程序的逻辑(需要CPU,因此必须在节点中同步),但相比之下,这些都是很小的事情
我不确定项
是什么,但是如果我必须猜测.find().sort()
所做的是在系统内部构建一个查询字符串。在调用.exec
之前,它不会实际运行查询(与数据库对话).exec
接受回调,因此它将与DB异步通信。通信完成后,将调用回调
在这种情况下,使用process.nextTick
不起任何作用。这只会将其代码的调用延迟到下一个事件循环,而无需这样做。它对同步性是否没有影响
我不太理解你的第二个问题,但是如果页面的呈现取决于查询的结果,那么你必须推迟页面的呈现,直到查询完成——这是通过在回调中呈现来实现的。渲染本身res.render
也可能不是完全同步的。它取决于定义render
函数的库的内部机制
在您的示例中,未定义next
。相反,您的代码应该看起来像:
app.get('/directory', function(req, res) {
Item.
find().
sort( 'date-modified' ).
exec(function (err, items) {
if (err) {
console.error(err);
res.status(500).end("Database error");
}
else {
res.render('directory.ejs', {
items : items
});
}
});
});
});
天啊,现在我有更多的问题了!顺便提一下,当你说它接受回调时,你的意思是你可以在它里面放一个函数(从而
返回一些东西)?或者我也没有完全收到回电?关于页面呈现,这是我没有得到的。因此,尽管我可以将数据库调用抽象出来以供重用,但这种结构没有什么问题?有几种方法可以编写异步代码。最低的形式(nodejs默认使用)是回调的概念。执行一个操作(如.exec()
)并传递一个函数,以便在数据可用时回调(因此,回调)。操作立即返回,其余的执行继续。在将来的某个时候,操作实际上会完成,并调用回调,通常有两个参数:error
和data
。其中错误
将为空或未定义,如果所有操作都成功完成。感谢您的解释-对代码的更正非常有用!我想询问有关错误块的问题,但打算单独调查,以避免出现“教我”节点波斯特:)重要的是,你所做的对我来说是有意义的。我应该顺便提一下,我使用的是mongoose和mongodb——这是mongoose查询格式。