2017-09-16 117 views
0

mongodb的Dog.find()Dog.create()前执行前执行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方法正在执行的结果,然后创建方法occurs.Can谁能解释这样对我?

回答

4

您已创建竞赛条件。两个调用都是异步的,这意味着它们不会立即返回,它们必须等待数据库完成其操作。但是,您通过在相同的时间间隔内同时执行两个调用。

基本上你的代码发送两个请求到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使用的承诺,而不是作为建议:

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

+1

Mongoose方法返回承诺,使用它们而不是回调。 – alexmac

+0

非常感谢你@Farid Nouri Neshat。并且肯定会在mongoose @ alexmac上签出承诺方法。谢谢你们俩 –