承诺:Q.all安排不等

时间:2013-10-09 19:31:31

标签: promise q

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

1 个答案:

答案 0 :(得分:4)

当解析器到达那一行时,

display()被调用,这就是你所说的对象中没有项目或“它没有等待”的原因。

您应该做的是以下内容:

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