2016-04-24 3 views
6

У меня есть класс в моем nodejs приложения со следующим кодом:Promise находится на рассмотрении

var mongoose = require('mongoose'); 
var Roles  = mongoose.model('roles'); 
var Promise  = require("bluebird"); 

module.exports = Role; 

var err = null; 
var id; 

function Role(name, companyId) { 
    this.err = err; 
    this.name = name; 
    this.companyId = companyId; 
    this.id = getId(name, companyId); 
} 



var getId = function (name, companyId) { 
    return new Promise(function(resolve, reject) { 
     Roles.findOne({companyId:companyId, name:name}, function(err,result) { 
       resolve(result._id); 
     }); 
    }); 
}; 

Когда я звоню класс, идентификатор находится на рассмотрении:

var currentRole = new Role(myRole, comId); 
console.log(currentRole); 

Как я могу получить значения из класса при их разрешении?

+0

Вы должны «отклонить», когда есть «ошибка». – Bergi

+0

Посмотрите на [Неправильная практика, чтобы функция-конструктор возвращала Promise?] (Http://stackoverflow.com/q/24398699/1048572) - вы, вероятно, не хотите делать 'currentRole.id.then (...) ' – Bergi

ответ

3

currentRole.id это обещание, так что вы можете позвонить then() на нее, чтобы ждать его, чтобы решить:

var currentRole = new Role(myRole, comId); 
currentRole.id.then(function (result) { 

    // do something with result 
}); 

Это чувствует себя странным API, хотя, вы ожидаете, что ваш объект будет «готов к использованию», когда его конструктор возвращается. Может быть лучше иметь getId быть обещание возвращения функции на прототипе Role так что вы вместо того, чтобы сделать что-то вроде:

var currentRole = new Role(myRole, comId); 
currentRole.getId().then(function (result) { 

    // do something with result 
}); 

Вы должны также рассмотреть вопрос о работе с этой ошибки, чтобы отклонить обещание:

var getId = function (name, companyId) { 
    return new Promise(function(resolve, reject) { 
     Roles.findOne({companyId:companyId, name:name}, function(err,result) { 

       if (err) { 
        return reject(err); 
       } 
       resolve(result._id); 
     }); 
    }); 
}; 

и добавить обработчик отбраковки на ваш призыв к getId:

var currentRole = new Role(myRole, comId); 
currentRole.getId().then(function (result) { 

    // do something with result 
}, function (err) { 

    // do something with err 
}); 

или что то же самое:

var currentRole = new Role(myRole, comId); 
currentRole.getId().then(function (result) { 

    // do something with result 
}).catch(function (err) { 

    // do something with err 
}); 
+0

Спасибо, Мэтт! Я использовал ваше последнее предложение, и код работает сейчас и выглядит намного чище. –

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