2016-03-10 191 views
0
var Promise = require("bluebird"); 
var MongoDB = Promise.promisifyAll(require('mongodb')); 
var MongoClient = MongoDB.MongoClient; 
var database = "mongodb://localhost/test"; 

MongoClient.connect(database) 
.then(function(db) { 
    var c1 = db.collection('c1'); 
    var c2 = db.collection('c2'); 
    return Promise.all([ 
    c1.count().then(function(count) { 
     if(count==0) { 
     return c1.insertMany([{a:1},{a:2}]); 
     } 
     else { // what should I write here? 
     }  // 
    }), 
    c2.count().then(function(count) { 
     if(count==0) { 
     return c2.insertMany([{a:1},{a:2}]); 
     } 
    }) 
    ]); 
}) 
.catch(function(err) { 
    console.log(err) 
}); 

它只是掛在那裏。爲什麼這個promise.all不起作用?

我應該在其他部分寫什麼?

if(count==0) { 
     return c1.insertMany([{a:1},{a:2}]); 
     } 
     else { // what should I write here? 
     }  // 
+0

好了,但只要返回一些東西。查看MDN [文檔和示例](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise/all)。你最大的問題是'Promise.all()'本身不做任何事情,你需要用'.then()'來解決實際執行任何事情。 –

回答

0

我猜db.collection()返回一個承諾,以及所以你需要寫這樣的事情

var Promise = require("bluebird"); 
var MongoDB = Promise.promisifyAll(require('mongodb')); 
var MongoClient = MongoDB.MongoClient; 
var database = "mongodb://localhost/test"; 

var insertIfEmpty = function(collection) { 
    collection.count().then(function(count) { 
    if(count==0) { 
     return collection.insertMany([{a:1},{a:2}]); 
    } 
    else { 
     return Promise.resolve() 
    }); 
} 


MongoClient.connect(database) 
.then(function(db) { 
    var promisedCollections = [db.collection('c1'), db.collection('c2')] 

    return Promise.all(promisedCollections).map(insertIfEmpty); 
}) 
.catch(function(err) { 
    console.log(err) 
}); 

如果您需要填充一個集合在同一時間,你可以使用。每代替.map