【问题标题】:Showing that node shell is async and mongo shell is not显示节点 shell 是异步的,而 mongo shell 不是
【发布时间】:2014-10-08 22:08:33
【问题描述】:

所以我有一个 mongodb 设置,里面有一些测试数据。我希望能够证明 mongo shell 运行我们的脚本同步,节点运行我们的脚本异步。我已经设置了以下两个 js 文件,这些文件是我在 Mongo 大学课程中获得的。这实际上更像是一个测试,以便我了解发生了什么。我将 cd 进入使用 npm 安装 mongo 的目录以及脚本所在的目录。然后我会调用这些脚本,我会使用

调用mongoshell.js
>mongo mongoshell.js

和 nodeshell.js 使用:

>node nodeshell.js

这是两个脚本:

mongoshell.js

//Find one document in our collection
var doc = db.allClasses.findOne();

print('before');

//Print the result
printjson(doc);

print('after');

我在 shell 中运行它得到的结果是:

所以我在这里的想法是打印命令会比对 mongo 的查询更快地返回。通过在打印之前和之后放置并且所有内容都以正确的顺序出现,它必须是同步的。

接下来我有 nodeshell.js

var MongoClient = require('mongodb').MongoClient;

MongoClient.connect('mongodb://127.0.0.1:27017/test', function(err, db){
    if (err) throw err;

    //Find one document in our collection
    db.collection('allClasses').findOne({}, function(err, doc){
        //Print the result
        console.dir(doc);

        //close the DB
        db.close();
    });
});

setTimeout(function(){
    console.dir("10 Milliseconds!");
}, 10);
setTimeout(function(){
    console.dir("100 Milliseconds!");
}, 100);

控制台的结果是:

我的想法是我已经确定 mongo 通常需要 10 到 100 毫秒来返回我的数据。如果我放置了两个超时的打印命令,一个在 10 毫秒,一个在 100 毫秒,一个应该在返回 json 之前触发,因为节点外壳是异步的,另一个应该在之后触发..

我的问题: 这个乡巴佬测试是否真的表明每个贝壳都是它们的样子。同步和异步?如果是,很酷,如果不是,为什么?

【问题讨论】:

  • 这不是很难回答吗?至少它必须显示节点外壳是异步的,因为我的 json 在我的两个打印命令之间返回。对吗?我是 Node 和 Mongo 的新手,只是想确保我了解正在发生的事情......
  • 这个问题似乎是题外话,更适合codereview.stackexchange.com,因为没有真正要回答的直接问题。也就是说,异步演示的通常过程是发出最后输出的语句作为第一条语句以明确这一点。
  • 有直接的问题要回答吗?而且我相信因为这与编程有关,而我作为初学者试图了解正在发生的事情。这是有效的。我实际上可能做错了什么或不了解 shell 的实际工作原理。有人可以指出这个错误,或者让我知道答案是肯定的。我还不够先进,不知道答案是什么,这就是我转向这里的原因。
  • 所以,尼尔,你不能对此采取行动吗?如果您认为我在节点 shell 中执行的代码由于它是异步的事实而打印出来,请告诉我?

标签: json node.js mongodb asynchronous synchronous


【解决方案1】:

我看不出这个超时技巧如何展示异步性质。这个怎么样?

var MongoClient = require('mongodb').MongoClient;

MongoClient.connect('mongodb://127.0.0.1:27017/test', function(err, db){
    if (err) throw err;

    //Find one document in our collection
    db.collection('allClasses').findOne({}, function(err, doc){
        console.log("Got the data!")

        //Print the result
        console.dir(doc);

        //close the DB
        db.close();
    });

    console.log("Data is being fetched and I do something else")
});

console.log("Mongo connection is being set up and I do something else")

输出

sergio@soviet-russia ‹ master ●● › : ~
[0] % node test.js
Mongo connection is being set up and I do something else
Data is being fetched and I do something else
Got the data!
null

【讨论】:

  • 我认为这证明了这一点,但对于不了解异步的其他人,我认为看到事情发生混乱会受益。我的示例运行一个获取一些数据的函数。该数据需要 10 到 100 毫秒才能返回数据。所以我的想法是在函数以 10 毫秒返回消息之后运行代码,所以如果它是异步的,它将在返回数据之前记录。然后我们看到数据返回,然后是 100 毫秒超时的消息。对我来说,考虑到每件物品的退回有些乱序是合乎逻辑的,这将证明是异步的
  • 我认为您的示例也显示了这一点,但我不相信需要了解异步工作原理的人会理解,因为这两条消息都会运行然后数据会返回。对我来说,它是异步的。但是对于一个不熟悉这个想法的人来说。我认为我的例子更能说明问题。照这样说。我充其量是一个该死的乡巴佬编码器,我知道什么!
  • @EricB:好吧,也许吧。我只是觉得很混乱。 :)
  • 让我感到困惑的是离题评论和反对票。我只是想在这里学习。我认为尼尔有一个他从未给出的好答案,因为他对我问这个愚蠢的问题感到不安。对不起,非常元..我知道
  • @EricB:这里有个想法:做两个查询,一个快一个慢。先开慢的,再开快的。用户在控制台中看到快速查询首先打印结果,会发现它必须是异步的。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
  • 2021-08-21
  • 2015-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多