Я пытаюсь получить данные в виде csv из URL-адреса в одном файле, а затем преобразовать этот csv в другом файле javascript в объект JSON, используя цепочку обещаний. Проблема в том, что он пытается преобразовать csv в json до того, как обратный вызов фактически извлечет csv.
(Примечание: я понимаю, что использую библиотеку запросов, которая сейчас устарела, и изменит ее, как только у меня цепочка обещаний работает).
Файл 1 (получение данных csv из URL) находится ниже. Мне нужно опросить URL, пока он не заполнится данными (обычно это занимает около 5 минут - заранее есть шаги аутентификации, но они работают нормально, поэтому я опускаю их, чтобы упростить это.) Это возвращает обещание, которое экспортируется как get_csv (). Обещание разрешается для строки CSV.
const request = require('request');
const csv_url = foo;
module.exports.get_csv = () => {
return new Promise ((resolve, reject) => {
function poll_url () {
request.get({url: csv_url
}, (error, response, body) => {
if (error) console.error(error);
data_csv = body;
if (data_csv === ''){
console.log("data_csv is blank.");
} else {
clearInterval(intervalID);
console.log("data_csv has been populated!");
resolve(data_csv);
}
})
}
pollURL()
var intervalID = setInterval(poll_url, 60000);
})
};
JS файл 2 (изменение данных CSV на json) ниже. Это означает просто добавить .then () к обещанию из файла 1, который преобразует данные из csv в json, а затем console.log () в данные json.
const data = require('./get_csv_data'); // File 1
const csv = require('csvtojson');
new Promise ((resolve, reject) => {
const data_csv_string = data.get_csv()
resolve(data_csv_string);
})
.then(
(data_csv_string) => {
console.log(data_csv_string); // for debugging - giving undefined
csv({output: "json"}).fromString(data_csv_string) // "Cannot read property 'toString' of undefined"
.then((data_json_string) => {
console.log(data_json_string);
})
}
)
Проблема заключается в том, что .then () файла 2 не ожидает завершения обратного вызова первого обещания. Консоль распечатает:
undefined
(node:10691) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'toString' of undefined
data_csv is blank.
data_csv is blank.
data_csv is blank.
data_csv is blank.
data_csv is blank.
data_csv is blank.
data_csv has been populated!
То, что я не могу обернуть вокруг себя, это то, что, если я добавлю условие .then () ниже в конце файла 1, оно будет работать. Что я делаю не так?
.then(
(data_csv_string) => {
console.log(data_csv_string);
csv({output: "json"}).fromString(data_csv_string)
.then((data_json_string) => {
console.log(data_json_string);
})
}
)