0

我在 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: {}
4

1 回答 1

4

display()当解析器到达该行时被调用,这就是为什么你的对象中没有项目或“它没有等待”,正如你所说。

你应该做的是:

Q.allSettled(promises).then(function() {
  display(lemmaHisto);
});
于 2013-10-09T19:38:20.387 回答