Я пытался понять ваш код и то, что вы пытаетесь достичь, а именно сделать несколько асинхронных вызовов (getData
) к API, получить ответ и сохранить их во временном объекте (alldata
) для последующей обработки. . И записать все данные в файл после выполнения всех вызовов API.
Хотя вам придется использовать res.send
и res.end
, вам, возможно, придется использовать обещания (см. здесь ) для выполнения нескольких асинхронных вызовов, а затем ждать ответа с любыми данными, которые вы хочу, чтобы после того, как эти обещания были решены или даны ответы.
app.get('/update', update);
function update(req, res) {
var allAsyncFunctions = [];
var targets = ...; //Your targets array
var alldata = {};
targets.forEach(function(tgt) {
allAsyncFunctions.push(getData(tgt));
}, this);
Promise.all(allAsyncFunctions).then(function(values) {
fs.writeFile('Value.json', JSON.stringify(alldata, null, 2), function() {
console.log("Data Saved"); //Wait for data to be fetched then respond to client
res.json({ "data": "All data saved or updated succesfully" });
})
});
};
function getdata(myCurrentTarget) {
return new Promise(function(res, rej) {
const baseURL = ""; //Empty as example
var url = baseURL + myCurrentTarget; // As we are already traversing targets array in update function
var urlsplit = targets[i].split("/");
var categoryid = urlsplit[0]
var id = urlsplit[1]
console.log("Getting " + id)
request.get(url, function(error, response, html) {
var productdata = [];
if (!error) {
let $ = cheerio.load(html);
var allitems = $("div.related-box");
allitems.each(function(index) {
productdata.push({
"product_name": $(this).find('.name').find('a').text(),
"price": $(this).find('.price').children().remove().end().text().replace(/(\r\n|\n|\r)/gm, "").trim()
})
})
if (!(categoryid in alldata)) {
alldata[categoryid] = {};
}
alldata[categoryid][id] = productdata;
res();
}
});
});
};
НТН.