Рассмотрите возможность сопоставления каждого запроса с Promise, затем используйте Promise.all
, а затем записывайте в файл только один раз :
const urlProms = urls.map(url => new Promise((resolve, reject) => {
https.get(url, (resp) => {
let data = '';
resp.on('data', (chunk) => {
data += chunk;
});
resp.on('end', () => resolve(data));
})
.on('error', reject);
}));
Promise.all(urlProms)
.then((dataArr) => {
fs.writeFile('my_file.json', JSON.stringify(dataArr), (err) => {
if (err) throw err;
});
})
.catch((err) => {
// handle errors
});
Построение / объединение строк JSON вручную редко бывает хорошей идеей. Если у вас было , чтобы сделать это вручную, используйте async
/ await
, чтобы ждать каждой итерации по порядку, чтобы убедиться, что все вставлено в правильном порядке, и что перекрывающиеся запросы не занимают слишком много памяти:
const getData = url => new Promise((resolve, reject) => {
https.get(url, (resp) => {
let data = '';
resp.on('data', (chunk) => {
data += chunk;
});
resp.on('end', () => resolve(data));
})
.on('error', reject);
});
(async () => {
fs.writeFileSync('my_file.json', '[', (err) => {
if (err) throw err;
});
for (let i = 0; i < urls.length; i++) {
const data = await getData(urls[i]);
fs.appendFileSync('my_file.json', data, (err) => {
if (err) throw err;
});
}
fs.appendFileSync('my_file.json', ']', (err) => {
if (err) throw err;
});
})();