node.js асинхронное возвращаемое значение и модуль экспорта - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь получить некоторые данные из CSV-файла, а затем поработать с ними и создать объект с этими производными данными.Я создал эту функцию с помощью module.exports и экспортировал ее.

var csvtojson = require('csvtojson');

var data = [];

module.exports = function createStock(name){
    var myObj = {};
    csvtojson().fromFile('./csv-raw/'+name+'.csv')
    .then(source => {
        source.forEach(value => {
            var row = {};
            row.Date = value.Date;
            row.Dividend_Yield = value.Dividend_Yield;
            row.Gross_Dividend_Per_Share = value.Gross_Dividend_Per_Share;
            row.Distribution_Rate = value.Distribution_Rate;
            data.push(row);
        });
    })
    .then(() => {
        myObj = {
            name: name,
            data: data,
            summary: {a: Math.random(), b: Math.random(), c: Math.random()}
        };
    })
    .then(() => {
        console.log(myObj)
        return myObj
    })  
}

И импорт в маршрут;

const createdStock = require('../../modified');

router.get('/new/:stockName', async (req,res) => {
   var stock = await createdStock(req.params.stockName);
   setTimeout(() => {
       console.log(stock);  
   }, 2000);

(я вижу результат console.log (myObj) внутри первого файла)

(могуне вижу console.log (stock); внутри второго файла)

Я пытался выяснить, проистекает ли проблема из-за асинхронного поведения JS, но смог найти какое-либо решение?

Как правило, мой вопрос - как я могу отправить данные, созданные внутри блока .then, в другой файл JS.

1 Ответ

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

В вашей функции createStock вам нужно перевести звонок на csvtojson.Это вернет Обещание, заставив await работать правильно.Тогда вам не понадобится setTimeout, и вы можете просто console.log(stock).

module.exports = function createStock(name){
  var myObj = {};
  return csvtojson().fromFile('./csv-raw/'+name+'.csv')
  ...
};
...