Как экспортировать дату, загруженную асинхронно из модуля Node.js - PullRequest
0 голосов
/ 19 сентября 2019

Я борюсь со следующим модулем fetch.js, который вызывает дочерний процесс, который генерирует вывод в нескольких файлах.Я хотел бы, чтобы этот модуль возвращал JSON, содержащий эти выходные данные.

    var util = require('util');
    const path = require('path');
    const fs = require('fs');

    const path1 = path.resolve(__dirname, 'out', 'file1');
    const path2 = path.resolve(__dirname, 'out', 'file2');

    let out1, out2;

    function generate() {
       var spawn = require('child_process').spawn;
       var prog = spawn('prog', [<arguments>]);

       prog.on('exit', function (code) {
       if (code != 0) {
           console.log('Compilation failed.');
       } else {
          out1 = fs.readFileSync(path1, 'utf8');
          out2 = fs.readFileSync(path2, 'utf8');
       }
    })

    prog.stderr.on('data', function (data) {
       console.log(data);
    })


    return {out1, out2}
}


module.exports = new Promise(function(resolve, reject) {
   resolve(generate());
});

В основном я делаю следующее

const promise = require('./fetch');
promise.then((o1, o2) => {
   console.log('O = ' + typeof o1);
})

Я знаю, что проблема в том, что возврат из generate происходит out1 иout2 приобретают свои значения.Как это можно исправить?ТИА

1 Ответ

0 голосов
/ 19 сентября 2019

Вы можете вернуть обещание из самой функции generate и экспортировать функцию generate.

const path = require('path');
const fs = require('fs');
function generate() {
  return new Promise((res, rej) => {
    const spawn = require('child_process').spawn;
    const prog = spawn('prog', []);

    prog.on('exit', function (code) {
      if (code != 0) {
        rej('Compilation failed');
      } else {
        const path1 = path.resolve(__dirname, 'out', 'file1');
        const path2 = path.resolve(__dirname, 'out', 'file2');
        const out1 = fs.readFileSync(path1, 'utf8');
        const out2 = fs.readFileSync(path2, 'utf8');
        res({ out1, out2 })
      }
    })
    prog.stderr.on('data', function (data) {
      console.log(data);
    })
  })
}


module.exports = generate;

Теперь, когда вы используете его, вы можете использовать его как:

const fetch = require('./fetch');
fetch()
.then(data=>{
  ....
});
...