mongodb Dog.find()在Dog.create()之前执行

我只是有一个我无法理解的问题,所以为什么会发生。
我刚开始通过在线教程学习mongodb。我在cloud9上练习代码。
我正在练习诸如find()和create()之类的基本查询。
我首先通过添加仅具有名称参数的新狗来添加Dog.create()方法,随后在create()方法下面添加了Dog.find()以查找数据库中存在的所有数据。

但是问题是Dog.find()首先执行,而Dog.create最后执行。

我已经在下面发布了代码。

var mongoose= require("mongoose");
mongoose.connect("mongodb://localhost/dog_app");

var dogSchema = new mongoose.Schema({
  name:String
});

var Dog = mongoose.model("Dog", dogSchema);

Dog.create({
    name:"duppy"
}, function(err, dog){
    if(err){
        console.log(err);
    }else{
        console.log("created a new dog");
        console.log(dog);
    }
});

Dog.find({}, function(err , dogs){
   if(err){
       console.log(err);
   } else{
       console.log("retrived from database");
       console.log(dogs);
   }
});


结果

adi188288:~/workspace/IntroToNode/Databases $ node dogs.js
(node:7113) DeprecationWarning: `open()` is deprecated in mongoose >= 4.11.0, use `openUri()` instead, or set the `useMongoClient` option if using `connect()` or `createConnection()`. See http://mongoosejs.com/docs/connections.html#use-mongo-client
retrived from database
[ { _id: 59bd6256bffba3198bce7e87, name: 'Puppy', __v: 0 } ]
created a new dog
{ __v: 0, name: 'Puppy2', _id: 59bd6932a2d4c81bc9488b74 }


您可以看到首先执行find方法然后执行create方法的结果。任何人都可以向我解释一下吗?

最佳答案

您已经创建了竞争条件。这两个调用都是异步的,这意味着它们不会立即返回,它们必须等待数据库完成其操作。但是,您要通过在同一刻度中并行执行两个调用。

基本上,您的代码向MongoDB发送两个请求;一个创建一只狗,另一个寻找狗。 MongoDB并行处理这两者,然后将两者的结果发送回去。在这种情况下,find调用花费的时间更少,因此它首先调用了回调。

如果要一个在另一个之后执行,则必须将它们放在回调中。仅在异步操作完成后才调用回调:

Dog.create({
    name:"duppy"
}, function(err, dog){
    if(err){
        console.log(err);
    }else{
        console.log("created a new dog");
        console.log(dog);

        Dog.find({}, function(err , dogs){
           if(err){
               console.log(err);
           } else{
               console.log("retrived from database");
               console.log(dogs);
           }
        });
    }
});


您可能还希望使用alexmac建议的Promise:

Dog.create({
    name:"duppy"
}).then(function(dog){
  console.log("created a new dog");
  console.log(dog);
  return Dog.find({});
}).then(function(dogs){
  console.log("retrived from database");
  console.log(dogs);
});


或者甚至可以使用async/await

10-04 14:19
查看更多