从具有异步函数的 Node.js 模块返回值

Return value from Node.js module with asynchronous function

本文关键字:Node js 模块 返回值 函数 异步      更新时间:2023-09-26

我为我的 Node.js 项目编写了一个模块,它处理一些数据并返回结果,如下所示:

var result = require('analyze').analyzeIt(data);

问题是analyze.js依赖于异步函数。基本上它看起来像这样:

var analyzeIt = function(data) {
    someEvent.once('fired', function() {
        // lots of code ...
    });
    return result;
};
exports.analyzeIt = analyzeIt;

当然,这是行不通的,因为result返回时仍然是空的。但是我该如何解决这个问题呢?

你解决它的方式与 Node 在其 API 中解决它的方式相同:使用回调,可能是简单的回调、事件回调或与某种承诺库关联的回调。前两个更像 Node,承诺的东西非常黑醋栗。

这是简单的回调方式:

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;

用法:

require('analyze').analyzeIt(data, function(err, result) {
    // ...use err and/or result here
});

但正如 Kirill 指出的那样,您可能希望analyzeIt返回一个EventEmitter,然后发出一个data事件(或者您喜欢的任何事件,真的),或者在出错时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;
};

用法:

require('analyze').analyzeIt(data)
    .on('error', function(err) {
        // ...use err here...
    })
    .on('data', function(result) {
        // ...use result here...
    });

或者,再次,某种承诺库。