Node.js中的函数编程 - 等待函数完成

时间:2015-06-02 14:45:08

标签: javascript node.js functional-programming

我是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);
    });
};

我的问题是如何将所有这些放在一起,以便在callback完全填充后我可以致电final。我确信这很简单,但我正在努力解决这个问题。我怀疑我可能要改变顺序,但我不知道该怎么做。

2 个答案:

答案 0 :(得分:2)

假设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);
    });
  });
};

答案 1 :(得分:-2)

你想让你的代码同步,有很多库可以实现这一点,其中一个有趣的方法是node-sync