Javascript Node.js中的函数编程-等待函数完成
我是Node.js的初学者。从语法上讲,我很高兴JavaScript使用它来构建web UI。我有Java和C#方面的OOP经验,并且我了解函数式编程的基础知识。然而,一旦复杂性超过某一点,我就开始发现它具有挑战性 我正在构建一个节点模块,其中包含了我编写的一些其他模块。它们各自的工作都很好,但我正试图将它们结合在一起Javascript Node.js中的函数编程-等待函数完成,javascript,node.js,functional-programming,Javascript,Node.js,Functional Programming,我是Node.js的初学者。从语法上讲,我很高兴JavaScript使用它来构建web UI。我有Java和C#方面的OOP经验,并且我了解函数式编程的基础知识。然而,一旦复杂性超过某一点,我就开始发现它具有挑战性 我正在构建一个节点模块,其中包含了我编写的一些其他模块。它们各自的工作都很好,但我正试图将它们结合在一起 var miner = require("./miner"), dbpedia = require("./dbpedia"); exports.getEntities
var miner = require("./miner"),
dbpedia = require("./dbpedia");
exports.getEntities = function(uri, callback) {
miner.extractEntities(uri, function (entities) {
var final = [];
entities.forEach(function (element, index) {
var newEntity = {
id : element.id,
title : element.title,
weight : element.weight,
uri : ""
};
dbpedia.getEntities(element.title, function(entity) {
if (entity.length > 0) {
newEntity.uri = entity[0].URI[0];
}
final.push(newEntity);
});
});
callback(final);
});
};
我的问题是如何将这一切放在一起,以便在
final
完全填充后调用callback
。我相信这很简单,但我正在努力解决它。我怀疑我可能必须颠倒顺序,但我不知道如何做。假设dbpedia.getEntities是一个异步函数,问题是forEach循环不会在每次迭代中等待函数完成。
正如SLaks所说,最简单的方法是使用async之类的库。
这些库具有异步循环。async.eachSeries将替换forEach,但如上所述,async.map保存了定义最终数组的过程
var miner = require("./miner"),
dbpedia = require("./dbpedia"),
async = require("async");
exports.getEntities = function(uri, callback) {
miner.extractEntities(uri, function (entities) {
async.map(entities, function(entity, callback) {
var newEntity = {
id : entity.id,
title : entity.title,
weight : entity.weight,
uri : ""
};
dbpedia.getEntities(element.title, function(entity) {
if (entity.length > 0) {
newEntity.uri = entity[0].URI[0];
}
callback(null, newEntity);
});
}, function(err, results) {
callback(null, results);
});
});
};
要使代码同步,有很多库可以实现这一点,其中一个有趣的方法是使用promises或
async.map
。不,这并不简单。如果您熟悉web UI,您应该熟悉异步回调(事件侦听器)?