Невозможно заставить работать асинхронный JavaScript

Я использую node.js, RailwayJS и JugglingDB.

У меня есть модель:

Model.afterInitialize = function() {
  var me = this;
  Sequence.getSequence('forModel', function(sequence) {
    me.serialId = sequence;
  });
  me.title = 'Hello';
}

После того, как это все сделано, только атрибут title установлено. Это не удивительно, но я не могу заставить его работать. Я пытался использовать async Модуль без удачи.

3 ответа

Решение

Model.afterInitialize является частью стороннего API, который я не могу изменить, поэтому, к сожалению, нет способа сделать это. Я надеялся, что какая-то проверка бесконечного цикла на наличие флага сработает, но это не сработает, и это будет уловкой, даже если это сработает.

Я в конечном итоге подключился к другому методу Model.beforeSave = function(callback) {};, который требует обратного вызова.

К вашему сведению, я использовал https://github.com/1602/jugglingdb

Добавлен параметр обратного вызова для возможности цепочки.

Model.afterInitialize = function(then)
{
  then = then || function(me) { };

  var me = this;

  Sequence.getSequence('forModel', function(sequence)
  {
    me.serialId = sequence;
    me.title = 'Hello';

    then.call(null, me);
  });
};

Если Sequence.getSequence асинхронный, serialId будет установлен из обратного вызова, когда он вызывается. Поскольку это асинхронный, это, вероятно, после Model.afterInitialize возвращается. Если вам нужно выполнить операции, которые зависят от serialId быть застреленным из Sequence.getSequence Перезвоните.

Другие вопросы по тегам