admin管理员组

文章数量:1291447

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?

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?

Share Improve this question asked Feb 4, 2015 at 15:07 wortwartwortwart 3,36030 silver badges34 bronze badges
Add a ment  | 

1 Answer 1

Reset to default 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.

本文标签: javascriptReturn value from Nodejs module with asynchronous functionStack Overflow