5

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?

1 Answer 1

10

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.

Sign up to request clarification or add additional context in comments.

2 Comments

Thanks! I didn't get the callback solution to work, so I fixed it with custom elements with which I have already some experience. I thought I could do without changing the caller syntax but I guess that's not possible. I hope Promises will get implemented in Io.js soon, that seems to be a rather elegant way to do it.
@wortwart: ES6 will have promises, but you can have them today, there are several promise libs out there.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.