竞争条件节点JS

时间:2017-11-14 09:13:09

标签: javascript node.js

我一直在阅读文档,但无论出于何种原因,我都看不到这里发生了什么。

我有两个函数,1通过url下载csv文件,下一个函数获取该csv文件并将其转换为JSON

FileDownload.js

const http = require('http');
const fs = require('fs');

module.exports = function(url, dest){
  var file = fs.createWriteStream(dest);
  return new Promise((resolve, reject) => {
  var responseSent = false; // flag to make sure that response is sent only once.
  http.get(url, response => {
    response.pipe(file);
      file.on('finish', () =>{
        file.close(() => {
          if(responseSent)  return;
            responseSent = true;
            resolve();
          });
       });
     }).on('error', err => {
       if(responseSent)  return;
         responseSent = true;
         reject(err);
       });
     });
}

CSVToJson.js

const csvjson = require('csvjson');
const fs = require('fs');
const write_file = require('../helpers/WriteToFile');

function csvToJson(csv_file, json_path) {

  var data = fs.readFileSync(csv_file, { encoding : 'utf8'});
  var options = {
    delimiter : ',',
    quote     : '"'
  };
  const json_data = csvjson.toObject(data, options);
  write_file(json_path, json_data)
}

module.exports = {
 csvToJson: csvToJson
}

然后我连续调用这些函数,但CSVToJsonFileDownload之前完成,从而导致失败(无数据转换)

data.js

const premier_league = require('./scripts/getCSVData')
const csv_to_json = require('./scripts/csvToJson')

const pl_json_path = './team_data/premier_league/clubs/all/premier_league.json'
const pl_csv_path = './csv/premier_league/premier_league.csv'

// Get Premier League CSV file
premier_league.getPremierLeagueData();

// Convert CSV Data to json
csv_to_json.csvToJson(pl_csv_path, pl_json_path )

在文件下载阶段我做错了什么?我还没有完全了解回调,我只想在下载文件后执行csv转换。

1 个答案:

答案 0 :(得分:0)

您正在使用Node,因此集成Promises来处理这些异步问题非常简单。

然后你可以基本上做FileDownLoad.then(CSVToJson)

99%的JS问题似乎归结为异步问题:D

进一步研究代码,我看到你也有这条线。

fs.readFileSync(csv_file, { encoding : 'utf8'});

这是另一个异步问题 - 您无法确定在调用csvjson方法之前已完成此操作。再次需要承诺。

=======更新==========

function csvToJson(csvFile, jsonPath) {
    fs.readFile(csvFile, 'utf8', (err, data) => {
        if(err) //handle me

        const options = {
            delimiter : ',',
            quote     : '"'
          };
        const jsonData = csvjson.toObject(data, options);
        write_file(jsonPath, jsonData)
    });
}

我想像上面这样的东西。你可以包含一些承诺,并使api成为一个很好的承诺基础,总是很好;)