2014-07-18 4 views
2

Как я «обещаю» свою собственную функцию (которая живет в другом каталоге)? Вот мой код:Как я могу обещать свою собственную функцию?

// app.js 

// include database 
var mongo = require('./mongo'); 
var promise = require('bluebird'); 
var u = require('./util.js'); 
var mongo.connect = promise.promisify(require(mongo.connect)); 

// connect to database 

var ago = new Date(new Date()-60000); // 10m ago 
var scope = {size:0.01}; 

mongo.connect() 
.then(
    mongo.endor.mapReduceAsync(u.mapTile, u.reduceTile,{ 
    out: {replace:'deathstar'}, scope:scope, 
    query: {time:{$gte:ago}}, finalize:u.finalTile})) 
.then(deathstar.find({},{fields:{_id:0, value: 1}}) 
    .toArray(function(err, docs){ 
    endor.insertAsync(_.map(docs, function(doc){return doc.value;}),{w:1}); 
) 
); 

А вот другого файла

// mongo.js 

var promise = require('bluebird'); 
var mongodb = require('mongodb'); 
var MongoClient = mongodb.MongoClient; 
promise.promisifyAll(mongodb); 

module.exports.connect = promise.method(function(){ 
    // database environment 
    var database; 
    if (process.env.NODE_ENV == 'production'){database = pro;} 
    else{database = database = dev;} 
    module.exports.database = database; 

    // connect to database 
    return MongoClient.connectAsync(database) 
    .then(function(db){ 
     module.exports.db = db; 
     promise.all([ 
     db.createCollectionAsync('hoth', {w:1}) 
      .then(function(collection){ 
      collection.ensureIndexAsync() 
       .then(function(index){ 
       module.exports.hoth = collection; 
       console.log(index+' hoth'); 
       }); 
      }), 
     db.createCollectionAsync('endor', {w:1}) 
      .then(function(collection){ 
      collection.ensureIndexAsync({}) 
       .then(function(index){ 
       module.exports.endor = collection; 
       console.log(index+' endor'); 
       }); 
      }), 
     db.createCollectionAsync('alderaan', {w:1}) 
      .then(function(collection){ 
      collection.ensureIndexAsync({time:-1, location:'2dsphere'}) 
       .then(function(index){ 
       module.exports.endor = collection; 
       console.log(index+' alderaan'); 
       }); 
      }) 
     ]).then(function(){callback(null);}); 
    } 
); 
}); 

и вот ошибка

/Users/Josh/Development/xWing/app.js:12 
mongo.connectAsync() 
^
TypeError: Object #<Object> has no method 'connectAsync' 

ответ

3

Обещания вернуть качества синхронного кода.

Учитывая, что ваш API уже многообещающий - вы просто возвращаете обещание от своей функции, а затем используете это.

module.exports.connect = Promise.method(function(){ 
    // do a bunch of stuff 
    return mongo.connectAsync().then(... 
}); 

Обратите внимание на Promise.method бит не требуется, она просто превращается брошенные ошибки в отказах, чтобы дать вам бросить безопасность и гарантирует, что вы вернуть обещание, так что это лучшая практика и охранники вас от неудач.

+0

спасибо за ответ, я думаю, что мой код что-то путал ... пожалуйста, взгляните еще раз. Я попытался выполнить ваше решение, но оно все еще не работает ... – joshula

+0

Недопустимый ваш 'promisify' - вы хотите' Promise.promisifyAll (mongodb) ', а не' Promise.promisify' при подключении. Кроме того, когда вы отвечаете «все еще не работает», поставьте исход, то, что вы пробовали с приведенным выше кодом и что не удалось (с какой ошибкой и когда). –

+0

Вы можете еще взглянуть выше? Я скорректировал код ... Я включил часть моего другого кода из монго, что, возможно, путало мое намерение. – joshula

Смежные вопросы