Можете ли вы заменить события обещаниями в Nodejs? - PullRequest
0 голосов
/ 02 октября 2018

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

add : function(req, res, next){
var workflow = req.app.utility.workflow(req, res);

workflow.on('checkPermissions', function(){
  // If admin is permitted to add Widget template
  var isPermitted = permissions.getPermission(req.user.group, "widget-template", "add");
  console.log("Is permitted to add WidgetTemplate:-", isPermitted);
  if(!isPermitted)
    workflow.emit('exception', 'Not Permitted');
  else
    workflow.emit('validate');
});

workflow.on('validate', function(){
  if(!req.body.wID)
    workflow.outcome.errfor.wID = 'required';

  if(!req.body.wname){
    workflow.outcome.errfor.wname = 'required';
  }

  if(workflow.hasErrors())
    {
      workflow.outcome.errfor.msg = 'Please fill all the fields';
      return workflow.emit('response');
    }
  else
    workflow.emit('add');
});

workflow.on('add', function(){
  var WidgetTemplate = req.app.db.models.WidgetTemplate;

  var fieldsToSet = new WidgetTemplate({
    widgetTempID : req.body.wID,
    name : req.body.wname,
    devType : req.body.devTypes,
    sensors : req.body.sensors,
    properties : req.body.properties? req.body.properties : [],
    multiple_devices : req.body.multiple_devices? req.body.multiple_devices : false,
    added_by : req.user.id
  });
  console.log("FieldsToset", fieldsToSet);
  fieldsToSet.save()
              .then(
                () => {
                  console.log("Widget Template created...");
                  workflow.emit('response');
                }
              )
              .catch((err) => {
                console.log("Some error occurred", err.code);
                if(err.code == 11000)
                  workflow.emit('exception', 'Duplicate widget template ID');
                else
                  workflow.emit('exception', err);
              });

});

workflow.emit('checkPermissions');

}

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Прослушиватель событий можно заменить обещанием только для событий, которые должны быть отправлены один раз, например, может быть обещан метод отправителя события once.В противном случае должно быть создано несколько обещаний.

p-event адресовано в обоих случаях.Это позволяет обещать событие, которое генерируется один раз:

const result = await pEvent(emitter, 'finish');

В противном случае оно позволяет выполнять итерации по обещаниям столько времени, сколько необходимо с асинхронными итераторами и for-await-of:

const asyncIterator = pEvent.iterator(emitter, 'data', {
    resolutionEvents: ['finish']
});

for await (const event of asyncIterator) {
    console.log(event);
}

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

0 голосов
/ 02 октября 2018

Основным недостатком является то, что обещания могут быть разрешены только один раз.Если ваши события относятся к этому типу, то, конечно, вы можете использовать обещание.Но многие события хотят происходить несколько раз, и обещания не являются хорошим способом представить это.

Одной из альтернатив будет использование Observables, которые имеют сходство с обещаниями, но могут излучать произвольное число раз.Они мощные и гибкие, но у них есть значительная кривая обучения.Одна из популярных библиотек для наблюдаемых: rxjs: https://github.com/ReactiveX/rxjs

...