我在 nodejs 中的脚本有问题,使用 Q 库进行承诺。该脚本应该:
- 从文本文件加载文本,
- 拆分句子/单词,
- 计算所有原始单词的出现次数,
- 使用外部数据库对单词进行词元化(提供对应词->词元),
- 计算所有引理的出现。
一切正常,除了在脚本末尾,当我想显示包含有关引理计数信息的对象时。这条线是这样的:
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: {}