Добрый день! Пишу несколько решений и столкнулся в принципе с однотипной проблемой и там и там, но опишу задачи раздельно.
Задача 1. Node.js, Парсинг.
Необходимо пробежаться по некоторым URL и сохранить информацию с них в JSON файл. Все это происходит как-то так:
var request = require ('request');
var cheerio = require ('cheerio');
const fs = require('fs');
var results = new Array();
var pagesCount = 47;
for (let i = 0; i < pagesCount; i++){
var URL = 'здесь ссылка плюс ид страницы='+i;
request(URL, async function (error, response, html) {
if (!error && response.statusCode == 200) {
var $ = cheerio.load(html);
$('tr:not(.spacer)').each(function(i, element){
// Тут происходит много строчек кода селекторов и записи в объект data.
console.log(data);
results.push(data);
});
}
});
}
// В конце мне все это нужно сохранить в JSON, То есть записать массив result
setTimeout(()=> {
console.log('saving...');
fs.writeFileSync("data.json", JSON.stringify(results,null,4));
},10000)
Проблема заключается в том, что 10000 (или 10 сек) это асинхронный костыль, который работает только на моей машине как надо. Если запустить это на слабом сервере - нужно будет прощупывать уже другую задержку. Как сделать так, чтобы сохранение произошло по готовности? И желательно с пояснением.
P.S. Если просто написать без timeOut, то он сохранит массив в момент начала парсинга. В итоге у меня пустой файл и запуск парсера.
Задача 2. onload для массива изображений
Есть canvas. В нем отрисовываются изображения как паттерны. Их зачастую 12 штук. Можно менять количество, не суть.
Изображения берутся с внешнего сервера и им нужно время на подзагрузку. После того как они загрузятся необходимо перерисовать canvas.
Вопрос, как проверить .onload для массива изображений, чтобы загрузились они все. Сейчас код выглядит примерно так, костыль тот же, что и раньше:
function totalUpdate() {
setGamesForRoll();
setTimeout(setImagesForRoll,0);
setTimeout(drawWhell, 800);
}
function setImagesForRoll() {
for (let i = 0; i < rollConfig.sections; i++){
sections[i] = games[i].name;
img[i] = new Image();
img[i].src = games[i].imagesrc +'?rand=' + Math.random();
img[i].width = '100px';
img[i].height = '100px';
}
}
Задержки в 0.8 секунд тоже не хватает при нестабильном интернет-подключении клиента.