【发布时间】:2020-06-02 15:43:44
【问题描述】:
我正在尝试从一个文件中的 URL 获取数据作为 csv,然后使用承诺链将另一个 javascript 文件中的该 csv 转换为 JSON 对象。问题是,它试图在回调实际检索到 csv 之前将 csv 转换为 json。
(注意:我意识到我正在使用现在已弃用的请求库,一旦我有承诺链工作就会更改它)。
文件 1(从 url 获取 csv 数据)如下。我需要轮询 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 中的 Promise 中,这会将数据从 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);
})
}
)
问题是文件 2 的 .then() 没有等待第一个 Promise 的回调完成。控制台打印出来:
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);
})
}
)
【问题讨论】:
-
你没有拒绝错误,如果字符串为空,你也没有解析。
-
如果您现在必须使用请求,请使用
request-promise。现在你正在用头撞墙,因为你在强迫自己从头开始实现一个承诺。使用返回承诺的库来简化问题。
标签: javascript node.js promise callback