我为我的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
在返回时仍为空。但是我该怎么解决呢?
答案 0 :(得分:8)
你解决它的方式与Node在其API中解决它的方式相同:使用回调,这可能是一个简单的回调,事件回调或与某种类型的promise库相关的回调。前两个更像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 points out,您可能希望analyzeIt
返回EventEmitter
,然后发出data
事件(或任何您喜欢的事件,真的),或{ {1}}出错:
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;
};
或者,再一次,某种承诺库。