2014-07-18 5 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.promisify'보다는'Promise.promisifyAll (mongodb)'를 원합니다. 또한 "여전히 작동하지 않음"으로 회신 할 때 위의 코드로 시도한 결과와 실패한 내용 (오류 및시기)을 제공하십시오. –

+0

위에서 한 번 더보세요. 나는 코드를 조정했다. 나는 내 의도를 혼란스럽게 할 수도있는 몽고 (mongo)의 다른 코드를 포함하고 있었다. – joshula

관련 문제