2017-09-19 1 views
1

Ich habe Benutzer-Service wie folgt aus:Was ist ein besserer Ansatz für den Umgang mit EventEmitter und zyklischen Anforderungen?

'use strict'; 

let events = require('services/events'); 

module.exports = { 
    create: function (data) { 
     doCreate(data).then(user => { 
      events.emit('user.create'); 
     }); 
    }, 

    addBonus: function (transaction) { 
     doSomething; 
    } 
} 

Und ich habe events Modul:

'use strict'; 

let EventEmitter = require('events').EventEmitter; 
let pubsub = new EventEmitter(); 
let userService = require('services/user'); 

pubsub.on('user.create', function(user) { 
    console.log('EVENT: user.create'); 
    doSomething(); 
} 

pubsub.on('payment.success', function(transaction) { 
    userService.addBonus(transaction); // check if it was first transaction then add bonus to user 
} 

module.exports = pubsub; 

In diesem Fall Code zyklisch hat erfordert und Code funktioniert nicht.

Ich denke, es ist üblich, wenn events Modul Service verwendet, die das Ereignis in diesem Modul emittieren. Was ist besser Ansatz, um diesen Fall zu entwerfen? Ich habe nächste Ideen:

  • einige events Module von Ereignissen geben
  • Funktion in user Dienstnutzungs Konstruktor klassifiziert erstellen
+0

War Dies ist eine akzeptable Antwort? – akaphenom

Antwort

2

Vielleicht den Code in mehrere Dateien brechen:

// services/user/create 
let events = require('services/events'); 
module.exports = { 
    create: function (data) { 
     doCreate(data).then(user => { 
      events.emit('user.create'); 
     }); 
    }, 
} 

// services/user/addBonus 
module.exports = { 
    addBonus: function (transaction) { 
     doSomething; 
    } 
} 

// services/events 
let EventEmitter = require('events').EventEmitter; 
let pubsub = new EventEmitter(); 
let userService = require('services/user/addBonus'); 

pubsub.on('user.create', function(user) { 
    console.log('EVENT: user.create'); 
    doSomething(); 
} 

pubsub.on('payment.success', function(transaction) { 
    userService.addBonus(transaction); // check if it was first transaction then add bonus to user 
} 
Verwandte Themen