Promise に Q ライブラリを使用している nodejs のスクリプトに問題があります。スクリプトは次のようになっています。
- テキストファイルからテキストを読み込み、
- 文/単語の分割、
- 生の単語の出現をすべてカウントし、
- 外部データベースを使用して単語を見出し語化する (対応する単語->見出し語を提供する)、
- すべての補題の出現を数えます。
レンマ カウントに関する情報を含むオブジェクトを表示するスクリプトの最後を除いて、すべて正常に動作します。行はこれです:
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: {}