Reputation: 3350
I wrote a module for my Node.js project which processes some data and is supposed to return the result, like that:
var result = require('analyze').analyzeIt(data);
The problem is that analyze.js
depends on an asynchronous function. Basically it looks like this:
var analyzeIt = function(data) {
someEvent.once('fired', function() {
// lots of code ...
});
return result;
};
exports.analyzeIt = analyzeIt;
Of course, this cannot work because result
is still empty when it is returned. But how can I solve that?
Upvotes: 5
Views: 5941
Reputation: 1074028
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.
Upvotes: 10