2012-04-10 4 views
0

Мне было интересно, в следующем примере, каким будет лучший способ справиться с повторным использованием моего объекта helpers?Повторное использование переменных/объектов в обратных вызовах

var test = { 
    Projects: 'an object goes here', 
    helpers: require('../helpers'), 

    test: function(req, res) { 
    if (this.helpers.is_post(req)) { 
     // tried this 
     var test = this.helpers; 

     this.Projects.byCode(req.params.project_code, function(project) { 
     if (!project) { 
      this.helpers.flash(req, 'error', 'Unable to find project.'); 
      // tried this 
      helpers.flash(req, 'error', 'Unable to find project.'); 
      res.redirect('/projects'); 
     } 
     }); 
    } 
    } 
}; 

Я знаю, что я не могу повторно использовать переменные, объекты и т.д. в функции обратного вызова, так как они не выполняются в течение того же времени выполнения, но все-таки должна быть какая-то лучше/четче способ сделать такое вещь?

Даже если я попытался переназначить this.helpers другой переменной, он дает мне ошибки, говорящие, что он не определен.

Спасибо!

ответ

4

Почему, по вашему мнению, вы не можете повторно использовать переменные внутри обратных вызовов? Они выполняются не только в одном и том же режиме, но и в том же потоке! Это красота JavaScript.

Вместо этого ваша проблема, скорее всего, является неправильным использованием этого. Например, он не будет работать без назначения var test = this.helpers. И даже это не будет работать, если вы вызываете метод, как так:

var testIt = test.test; 
testIt(req, res); 

попробовать что-то вроде следующего вместо:

var helpers = require('../helpers'); 

var test = { 
    Projects: 'an object goes here', 

    test: function(req, res) { 
    if (helpers.is_post(req)) { 
     this.Projects.byCode(req.params.project_code, function(project) { 
     if (!project) { 
      helpers.flash(req, 'error', 'Unable to find project.'); 
      res.redirect('/projects'); 
     } 
     }); 
    } 
    } 
}; 

Это действительно довольно бессмысленно положить весь модуль как свойство вашего объект, во всяком случае.

+0

О, я забыл детали, я отредактирую свой пример кода. – TomShreds

+0

Там вы идете, мой вопрос будет яснее. Благодаря! – TomShreds

+0

О, доброта, это полностью меняет ответ. – Domenic

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