Объединение асинхронного кода с синхронными структурами - PullRequest
0 голосов
/ 20 марта 2012

Я пытаюсь использовать магистраль для «всего» на стороне сервера (с Nodejs), и застрял при выполнении правильной проверки.

Проблема заключается в том, что метод validate в backbone возвращает логическое значение, и внутри него должна быть реализована механика проверки, но с узлом эта механика является асинхронной, поэтому метод validate возвращается до оценки моего кода.

Вот пример кода, который хорошо иллюстрирует мою настройку:

Backbone.Model.extend({
  validate: function(){
    var result;
    Jobs._withCollection(function(err, collection){
      collection.count(query, function(count){
         result = count > 1 ? "Job already exist" : null;
      });
    })
    return result;
  }
})

Я мог бы немного улучшить это, но я не уверен, что это сработает:

function _validate(){
    Jobs._withCollection(function(err, collection){
      collection.count(query, function(count){
         yield count > 1 ? "Job already exist" : null;
      });
    })
}

Backbone.Model.extend({
  validate: function(){
    return _validate.call(this);
  }
})

Особенно не для немного более сложных ситуаций, когда я использую async, например, и возвращаемое значение устанавливается в последнем обратном вызове async, как здесь (это, очевидно, неправильно, так как res равно нулю при возврате):

Backbone.Model.extend({
  validate: function(){
    var res;
    async.parallel([
        .. do stuff ..
    ], function(err, results){
        res = results;
    })
    return results;
  }
})

Есть идеи?

1 Ответ

1 голос
/ 20 марта 2012

Асинхронная проверка потребует некоторой поддержки асинхронности, что для узлов означает, что validate должен будет исключить обратный вызов. Вам нужно будет создать подклассы магистральных классов для поддержки этого, или, как говорит @Derick, не связывайтесь с магистралью на сервере. Еще одно несоответствие, которое вы обнаружите, заключается в том, что магистраль обрабатывает обратные вызовы успеха / неудачи с помощью двух разных функций, как это делает jquery, но в файле node.js используется один обратный вызов с необязательной ошибкой в ​​качестве первого позиционного аргумента. Таким образом, если вы попытаетесь использовать такие вещи, как Model.save() на сервере, вам придется повсеместно писать небольшие функции адаптера для перевода из стиля jquery в обработку асинхронных ошибок в стиле узла.

Я получил классы Backbone, работающие в узле, но для этого требуются следующие типы адаптаций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...