You solve it the same way Node solves it in its API: With a callback, which might be a simple callback, an event callback, or a callback associated with a promise library of some kind. The first two are more Node-like, the promise stuff is very au currant.
Here's the simple callback way:
var analyzeIt = function(data, callback) {
someEvent.once('fired', function() {
// lots of code ...
// Done, send result (or of course send an error instead)
callback(null, result); // By Node API convention (I believe),
// the first arg is an error if any,
// the second data if no error
});
};
exports.analyzeIt = analyzeIt;
Usage:
require('analyze').analyzeIt(data, function(err, result) {
// ...use err and/or result here
});
But as Kirill points out, you might want to have analyzeIt return an EventEmitter and then emit a data event (or whatever event you like, really), or error on error:
var analyzeIt = function(data) {
var emitter = new EventEmitter();
// I assume something asynchronous happens here, so
someEvent.once('fired', function() {
// lots of code ...
// Emit the data event (or error, of course)
emitter.emit('data', result);
});
return emitter;
};
Usage:
require('analyze').analyzeIt(data)
.on('error', function(err) {
// ...use err here...
})
.on('data', function(result) {
// ...use result here...
});
Or, again, some kind of promises library.