2013-10-09 1 views
0

У меня проблема со сценарием в nodejs, используя библиотеку Q для обещаний. Скрипт должен:Посылы: Q.allSettled не ждет

  • нагрузки текст из текстового файла,
  • расщепленных предложений/слова,
  • сосчитать все сырые вхождения слов,
  • lemmatize слов с использованием внешней базы данных (при условии соответствия слова-> леммы),
  • подсчитывает все входы леммы.

Все работает нормально, за исключением конца сценария, когда я хочу отобразить объект, содержащий информацию о подсчетах леммы. Заключается в следующем:

Q.allSettled(promises).then(display(lemmaHisto)); 

Оказывается, что он не ждать, пока все обещания должны быть выполнены перед вызовом функции дисплея, и я не мог понять, почему после многих попыток и просмотра.

Спасибо за любую помощь, которую вы можете дать.

Вот мой сценарий:

var fs = require('fs'); 
var _ = require('lodash'); 
var sqlite3 = require('sqlite3').verbose(); 
var events = require('events'); 

var db; 
var dbPath = 'incrime.db'; 
db = new sqlite3.Database(dbPath, sqlite3.OPEN_READONLY); 
db.serialize(); 

var Q = require('q'); 
var dbget = function (sql) { 
    var d = Q.defer(); 
    db.get(sql, function (err, row) { 
    if (err) { d.reject(err); } 
    else { d.resolve(row); } 
    }); 
    return d.promise; 
}; 

var rqst = fs.readFileSync('request.sql', {encoding:'utf-8'}); 
var txt = fs.readFile('txt/sample.txt', {encoding:'utf-8'}, analysis); 

function analysis(err, data) { 
    var sentences = data.split(/[.!?]+\s/g); 
    var wordHisto = {}; 
    var lemmaHisto = {}; 

    var indexWord = function (w) { 
    if (wordHisto[w]) { wordHisto[w] += 1; } 
    else { wordHisto[w] = 1; } 
    }; 

    var indexLemma = function (word) { 
    var obj = lemmaHisto; 
    var qty = wordHisto[word]; 
    return function (row) { 
     var w = row.lemme ? row.lemme : word; 
     if (obj[w]) { obj[w] += qty; } 
     else { obj[w] = qty; } 
     return qty; 
    }; 
    }; 

    _.each(sentences, function(s) { 
    s = s.toLowerCase(); 
    var words = s.match(/[a-zéàèâêîôûäëïü-]{3,}/g); 
    _.each(words, indexWord); 
    }); 

    var promises = []; 

    _.each(_.keys(wordHisto), function(w) { 
    var sql = rqst.replace('%word%', w); 
    var promise = dbget(sql).then(indexLemma(w), console.error); 
    promises.push(promise); 
    return promise; 
    }); 

    Q.allSettled(promises).then(display(lemmaHisto)); 
} 

function display (obj) { 
    var d = Q.defer(); 
    console.log('display:', obj); 
    d.resolve(); 
    return d.promise; 
} 

Выход я просто:

display: {} 

ответ

4

display() вызывается, когда парсер достигает этой линии, поэтому там нет товаров в объекте или «Это не ждет», как вы заявляете.

Что вы должны сделать, это следующее:

Q.allSettled(promises).then(function() { 
    display(lemmaHisto); 
}); 
+4

мне стыдно. Благодарю. – glmxndr