Объект не возвращается из функции обещания

72
10

// Thing is a mongoose model imported from thing.model.js file (the mongoose in that file has been promisify)    
exports.show = function(req, res) {
return res.json(getThing(req.params.id))
};

function getThing(thingID){
return Thing.findByIdAsync(thingID).then(function(thing){
return thing;
})
}

Как я могу получить вещь из функции. Сейчас он просто возвращает объект обещания (разрешать и отклонять поля). Если я удалю первый "возврат" в вспомогательной функции getThing, он ничего не вернет. (Я попробовал console.log (вещь в блоке callback затем и отлично работает))

Если бы я написал так:

exports.show = function(req, res) {
return Thing.findByIdAsync(req.params.id)
.then(function(thing){return res.json(thing);})
};

Это будет работать! Зачем?

спросил(а) 2015-11-19T04:54:00+03:00 5 лет назад
1
Решение
71

Вот ваш лучший фрагмент

exports.show = function(req, res) {
return res.json(getThing(req.params.id))
};

function getThing(thingID){
return Thing.findByIdAsync(thingID).then(function(thing){
return thing;
})
}

в getThing избыточно, поэтому getThing по существу

function getThing(thingID){
return Thing.findByIdAsync(thingID);
}

так что export.show в основном

exports.show = function(req, res) {
return res.json(Thing.findByIdAsync(req.params.id))
};

вы по существу делаете res.json на Promise

который отличается от:

exports.show = function(req, res) {
return Thing.findByIdAsync(req.params.id)
.then(function(thing){return res.json(thing);})
};

где вы возвращаете обещание res.json результата findByIdAsync

Что вы хотите сделать, если хотите разделить функции

exports.show = function(req, res) {
return getThing(req.params.id)
.then(function(thing){return res.json(thing);})
};

function getThing(thingID){
return Thing.findByIdAsync(thingID);
}

или

exports.show = function(req, res) {
return getThing(req.params.id);
};

function getThing(thingID){
return Thing.findByIdAsync(thingID)
.then(function(thing){return res.json(thing);});
}

ответил(а) 2015-11-19T05:11:00+03:00 5 лет назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема