我一直在阅读文档,但无论出于何种原因,我都看不到这里发生了什么。
我有两个函数,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
}
然后我连续调用这些函数,但CSVToJson
在FileDownload
之前完成,从而导致失败(无数据转换)
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转换。
答案 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成为一个很好的承诺基础,总是很好;)