Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在node.js中是异步还是不异步?_Node.js_Mongodb_Asynchronous_Express_Mongoose - Fatal编程技术网

在node.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,

我还在学习node.js的诀窍,我只是想弄清楚我应该推迟什么,应该执行什么

我知道一般来说还有其他与这个主题相关的问题,但我担心没有一个更相关的例子,我很难“理解”

我的一般理解是,如果正在执行的代码非常重要,那么异步它可能是一个好主意,以避免它阻塞其他人的会话。很明显,事情远不止这些,回调被提到了很多,我不是100%理解为什么你不同步所有的东西。我还有一些路要走

下面是我在express.js应用程序中编写的一些基本代码:

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查询格式。