locomotivejs и mongoose: передача переменных обещания контроллеру

Преамбула: я не уверен, что это лучший способ задать этот вопрос, так как я уверен, что он более общий, чем я делаю, и, вероятно, есть глобальная модель, которая решает мою проблему.

На данный момент вот вопрос в контексте исходного кода, с которым я работаю.

Учитывая контроллер locomotivejs, давайте назовем его Contact_Controller, с общей структурой, подобной этой:

'\controllers\contact_controller.js
var locomotive = require('locomotive')
    , Controller = locomotive.Controller
    , Contact = require('../models/contact')
    , sender = require('../helpers/sender')
    ;


var Contact_Controller = new Controller();

а потом:

Contact_Controller.list = function() {
//Provides a list of all current (successful) contact attempts


var controller = this;

Contact.find({status: 1}, function(err, results) {
    if(err) {
        controller.redirect(controller.urlFor({controller: "dashboard", action: "error"}));
    }
    controller.contacts = results;
    controller.render();
});
};

и модель:

'/models/contact.js
var mongoose = require('mongoose')
, mongooseTypes = require('mongoose-types')
, pass = require('pwd')
, crypto = require('crypto')
, Schema = mongoose.Schema
, Email = mongoose.SchemaTypes.Email;


var ContactSchema = new Schema({
email: {type: Email, required: true},
subject: {type: String, required: true },
message: { type: String, required: true},
status: {type: Number, required: true, default: 1},
contact_time: {type: Date, default: Date.now}
});


module.exports = mongoose.model('contact', ContactSchema);

Внутри списка действий contact_controller я бы действительно не хотел использовать controller = this; Я вообще предпочитаю использовать redirect = this.redirect.bind(this); стиль локализованного связывания для обработки подобных ситуаций.

Тем не менее, я не могу придумать способ вернуть результаты в контроллер this объект без создания глобальной переменной версии this и с обратным вызовом обещание поговорить с этим. Есть ли лучший способ вернуть переменную результатов или выставить объект contact_controller в этом контексте?

1 ответ

Решение

Вы имеете в виду это?

Contact.find({status: 1}, function(err, results) {
  if (err) {
    this.redirect(this.urlFor({this: "dashboard", action: "error"}));
    return; // you should return here, otherwise `render` will still be called!
  }
  this.contacts = results;
  this.render();
}.bind(this));
 ^^^^^^^^^^^ here you bind the controller object to the callback function
Другие вопросы по тегам