2017-09-16 110 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上籤出承諾方法。謝謝你們倆 –