2014-02-12 4 views
0

Я пытаюсь написать приложение в узле, которое сначала проанализирует json stirng, подтвердите, содержит ли эта строка необходимые пары ключ/значение и в конечном итоге больше обрабатывает эти данные , Мы используем async.waterfall для вызова наших функций, так как результат должен быть передан от одной функции к другой.использование и использование узла eventEmitter в вызове async.waterfall

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

var MetadataIngester = function() { 
    var status, returnValue; 
    eventEmitter.call(this); 
} 

util.inherits(MetadataIngester, eventEmitter); 

MetadataIngester.prototype.sendEvent = function(eventType, eventMessage) { 
    this.emit(eventType, eventMessage); 
} 

MetadataIngester.prototype.clobber = function(itemString) { 
    var self = this; 
    var asyncParseItem = self.parseItem; 
    var asyncValidateItem = self.validateItem; 
    var asyncSendvent = self.sendEvent; 
    async.waterfall(
     [ 
      function(callback) { 
       asyncParseItem(itemString, callback); 
      }, 
      asyncValidateItem 
     ], 
     function(err, result) { 
      if (err) { 
       asyncSendEvent.call(self, 'wtf', result); 
      } else { 
       asyncSendEvent.call(self, 'success', { 
        'remedia_id': 123 
       }); 
      } 
     } 
    ); 

Чтобы проверить это, я делаю следующее:

describe("#clobber", function() { 
    it('should emit an error event if item has not been inserted', function() { 
     item = "{}"; 
     metadata.on('wtf', errorSpy); 
     metadata.clobber(item); 
     expect(errorSpy).to.have.been.called; 
    }); 


}); 

describe("#sendEvent", function() { 
    it('should emit an wtf event if an error event type is passed in', function() { 
     metadata.on('wtf', errorSpy); 
     metadata.sendEvent('wtf', {'ihateyou': 'wtf'}); 
     expect(errorSpy).to.have.been.called; 
    }); 
}); 

Когда я запускаю первый тест, то генерируется событие, но шпион никогда не называется. Однако, если я вызываю функцию, которая испускает событие напрямую, как в случае второго теста, он работает отлично, и я не уверен, почему. Мне нужно получить события, захваченные тестовым файлом, так как в конечном итоге я буду использовать этот MetadataIngester с очередью, которая вытаскивает сообщения из очереди, и этот потребитель вызывает то, что вызывает этот файл, и ожидает повторных событий, чтобы он знал, что делать дальше.

Любая помощь будет принята с благодарностью.

+0

Примечание 'вар asyncSendvent' пишется иначе, чем' asyncSendEvent' позже при вызове. – Kenan

+0

Чтобы лучше помочь вам, было бы хорошо посмотреть, какие функции вы вызываете и как определяются шпионы. Может быть, вы можете создать скрипку? Может быть, это просто проблема с областью, я дал ответ, чтобы сделать пример кода. – Sonata

ответ

0

Если вы хотите сохранить свой охват в обратном вызове, используйте Function.bind. Это держит ваш код менее загроможден (нет волшебной self, that и т.д.):

async.waterfall([ 
    function(callback) { 
     this.parseItem(itemString, callback); 
    }.bind(this), 
    this.validateItem 
], function(err, result) { 
    if (err) { 
     this.endEvent('wtf', result); 
    } else { 
     this.sendEvent('success', { 
      'remedia_id': 123 
     }.bind(this)); 
    } 
}.bind(this)); 
Смежные вопросы