Когда я пытаюсь использовать, возможно, асинхронные запросы, я часто получаю такие ошибки, как:
socket hang up
read ECONNRESET
connect ETIMEDOUT IP:PORT
ETIMEDOUT
ESOCKETTIMEDOUT
Я пытался увеличить maxSockets, keepAlive и т. Д. Безрезультатно.
// promises array to store mutations (data)
var urlDataPromiseArray = [];
var sizeDataPromiseArray = [];
// here is the function (request) to grab the data:
function getData(url, i) {
return new Promise(function (resolve) {
var serverWork = 'serverWork/dataSave_' + i + '_.txt';
var fs_cws_serverWork = fs.createWriteStream(serverWork, 'utf8');
var requestData = request({url : url}, function(err, resp, data) {
if (err || resp.statusCode >= 400) {
if (err) {
console.log('something goes bad! - ' + err + ' --- ' + i);
sizeDataPromiseArray.push(getSize(i, 0));
return resolve(i + ' bad');
}
else {
console.log('something goes bad! - ' + i);
sizeDataPromiseArray.push(getSize(i, 0));
return resolve(i + ' bad');
}
}
else if (!err && resp.statusCode === 200) {
var dataLength = data.length;
console.log('ok! - ' + i + ' - ' + dataLength);
sizeDataPromiseArray.push(getSize(i, dataLength));
return resolve(i + ' good - ' + dataLength);
}
else {
console.log('need to check - ' + i);
sizeDataPromiseArray.push(getSize(i, 0));
return resolve(i + ' shit happens');
}
}).pipe(fs_cws_serverWork);
})
}
// another function to calculate size of downloaded data
function getSize(i, size) {
return new Promise(function(resolve) {
resolve({
[i]: size
});
});
}
// here we prepare the loop:
var loop = 800;
for (var i = 0; i < loop; i++) {
urlDataPromiseArray.push(getData('https://www.google.com', i));
sizeDataPromiseArray.push(getSize(i, 0));
}
Promise.all(urlDataPromiseArray).then(function(url) {
console.log();
console.log('===============');
console.log('===============');
console.log('===============');
console.log();
}).then(function() {
return Promise.all(sizeDataPromiseArray).then(function(size) {
size.forEach(function(item) {
for (var key in item) {
var value = item[key];
console.log('--------');
console.log(value + ' - size of request number: ' + key);
console.log('--------');
};
});
});
}).catch(function(err) {
console.log('ERROR: ' + err);
});
console.log();
console.log('===============');
console.log('loop is finished - now we wait for async work to be done');
console.log('===============');
console.log();
Что я могу сделать, чтобы выполнить обещания?Я знаю, что запрос 800 - это слишком много для одновременной обработки, но я не знаю, как разделить перенаправления, чтобы они все выполнялись, и благодаря этому обещания также выполняются.