2015-06-02 3 views
-1

Я начинаю с Node.js. Синтаксически я доволен тем, что JavaScript использовал его для создания веб-интерфейсов. У меня есть тоны опыта ООП в Java и C#, и я понимаю основы базового программирования. Однако, как только сложность становится выше определенного момента, я начинаю находить ее сложной.Функциональное программирование в Node.js - Подождите завершения функции

Я строю модуль узла, который содержит некоторые другие модули, которые я написал. Они каждый работают отлично самостоятельно, но я пытаюсь объединить их вместе.

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 полностью заполнен. Я уверен, что это что-то простое, но я изо всех сил пытаюсь это исправить. Я подозреваю, что мне, возможно, придется отменить порядок, но я не понимаю, как это сделать.

+6

Используйте обещание или 'async.map'. – SLaks

+1

Нет, это не просто. Если вы знакомы с веб-интерфейсом, вы должны быть знакомы с асинхронными обратными вызовами (прослушиватели событий)? – Bergi

ответ

1

Предполагая, что dbpedia.getEntities является асинхронной функцией, проблема в том, что цикл forEach не будет ждать на каждой итерации для завершения функции. Как сказал Слакс, самым простым путем является использование библиотеки, такой как 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); 
    }); 
    }); 
}; 
+0

Спасибо, что отлично работали – baynezy

-2

Вы хотите сделать свой код синхронно, есть много библиотек там для того чтобы достигнуть этого, один из интересных способов сделать это node-sync

Смежные вопросы