我想从几个urls中获取一些数据并写入csv文件。但结果并不令我满意,因为我没有得到所有的数据(在这种情况下应该是10个),而且获取的数据的顺序也不对,应该是1,2,3等等,但我得到的是随机的,6,10,5,1......。应该是1,2,3等等,但是我得到的是随机的,6,10,5,1......。从这段代码中,我有时得到6个h3值,有时得到5个,这是随机发生的。我的url地址是100%好的。我使用了async await语法,但是没有任何帮助。我是初学者。这是我的代码。
const request = require('request');
const cheerio = require('cheerio');
const fs = require('fs');
const writeSteam = fs.createWriteStream('data.csv');
let data= '';
const numOfFetchData = 10;
const numbers = Array.from(Array(numOfFetchData + 1).keys());
async function getData() {
for await (const number of numbers) {
request('randomURL/' + (number+1), (err, res, html) => {
if(!err && res.statusCode == 200 && (number+1) <= numOfFetchData) {
const $ = cheerio.load(html);
const h3Tag = $("h3")[0].children[0].data;
data += (number + 1) + ' ' + h3Tag + '\n'
} else {
writeSteam.write(`${data}`);
}
});
};
};
getData();
我的代码有什么需要改进的地方?
谢谢和最好的祝愿
再看了一下你的代码,似乎请求库并不返回承诺,而是通过回调工作(使得asyncawait无法使用)。如果你真的想让你的代码按顺序被获取,你可以
async function getData(numbers) {
request('randomURL/' + (numbers[numbers.length - 1] + 1), (err, res, html) => {
numbers.pop()
if(!err && res.statusCode == 200 && (number+1) <= numOfFetchData) {
const $ = cheerio.load(html);
const h3Tag = $("h3")[0].children[0].data;
data += (number + 1) + ' ' + h3Tag + '\n'
} else {
writeSteam.write(`${data}`);
}
if (numbers.length > 0) getData(numbers);
});
};
getData(numbers);
async function getData() {
let fetchPromises = numbers.map(number => fetch('randomURL/' + (number+1)));
const results = await Promise.all(fetchPromises); // results in order
// Handle results
};