Node.js 中的函数式编程 - 等待函数完成
Functional Programming in Node.js - Wait for completion of function
我是 Node.js 的初学者。从语法上讲,我很高兴 JavaScript 使用它来构建 Web UI。我在 Java 和 C# 方面有一定的 OOP 经验,并且了解函数式编程基础知识。然而,一旦复杂度超过某个点,我就开始发现它具有挑战性。
我正在构建一个 Node 模块,其中包含我编写的其他一些模块。他们每个人都可以很好地独立工作,但我正在尝试将他们整合在一起。
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);
});
});
};
您想使您的代码同步,有很多库可以实现这一点,其中一种有趣的方法是 node-sync
我是 Node.js 的初学者。从语法上讲,我很高兴 JavaScript 使用它来构建 Web UI。我在 Java 和 C# 方面有一定的 OOP 经验,并且了解函数式编程基础知识。然而,一旦复杂度超过某个点,我就开始发现它具有挑战性。
我正在构建一个 Node 模块,其中包含我编写的其他一些模块。他们每个人都可以很好地独立工作,但我正在尝试将他们整合在一起。
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);
});
});
};
您想使您的代码同步,有很多库可以实现这一点,其中一种有趣的方法是 node-sync