簡體   English   中英

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

您想使代碼同步,那里有很多庫可以做到這一點,有趣的方法之一是節點同步

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM