我对nodejs中的脚本有问题,使用Q库进行promises。 该脚本应该:
一切正常,除非在脚本结束时,我想显示包含有关引理计数的信息的对象。这条线是:
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: {}
答案 0 :(得分:4)
display()
被调用,这就是你所说的对象中没有项目或“它没有等待”的原因。
您应该做的是以下内容:
Q.allSettled(promises).then(function() {
display(lemmaHisto);
});