читать файлы docx в каталоге и объединять содержимое вместе в узле? - PullRequest
0 голосов
/ 30 декабря 2018

код необходим для чтения всех файлов в каталоге и возврата всего содержимого в каждом файле docx этого каталога.

Я использую библиотеки glob и mammoth для чтения каталога и файла docx соответственно.Однако я хочу объединить содержимое каждого файла в более крупный.но так как узел асинхронный, код, который я сделал, передаст мне пустой контент перед чтением каждого файла.

var mammoth = require("mammoth");
var glob = require("glob");
function readAllFiles(dir){

  var data_collection = '';
  return new Promise(async(resolve, reject) => {
    // reading the directory
    glob(dir,  function (er, files) { 
      console.log(files);
      // for each file in the directory read its content
      _.map(files, function(file){
        mammoth.extractRawText({path: file})
            .then(function(result){
                var text = result.value; // The raw text
                var messages = result.messages;
                text = text.replace(/(^[ \t]*\n)/gm, "").replace('\r', '').replace('\n', '');
                console.log('extractRawText',text);
                // concat the small content into big content
                data_collection = data_collection + " "+text;
            })
            .done();
      });
      resolve(data_collection);
    });
  });
}

как бы решить проблему?

1 Ответ

0 голосов
/ 30 декабря 2018

_. Карта синхронная.Это не ждет, что мамонт обещает разрешить.Строка resolve(data_collection); будет выполнена сразу после _.map и до разрешения обещаний мамонта.Вот почему data_collection является пустым.

Вы можете использовать что-то вроде

var mammoth = require("mammoth");
var glob = require("glob");

function readAllFiles(dir){
  return new Promise((resolve, reject) => {
    glob(dir, (err, files) => {
      if(err) {
        return reject(err)
      }

      return Promise.all(files.map((file) => mammoth.extractRawText({ path: file })))
        .then((results) => {
          let data = ''
          results.forEach((result) => {
            const value = result.value.replace(/(^[ \t]*\n)/gm, "").replace('\r', '')
            data = data.concat(value)
          })
          resolve(data)
        })
        .catch(reject)
    })
  })
}

async function test() {
  const data = await readAllFiles('./test/**/*.docx') // All my docx files are in the test directory
  console.log(data) // Print data
}

test()

Обратите внимание, что это будет выполнять вызовы функции mammoth.extractRawText параллельно.Если вам нужно ограничить количество одновременных параллельных вызовов, вы можете использовать что-то вроде async.mapLimit .

...