const promiseRace = promises => (
new Promise((fulfil, reject) => {
promises.forEach((promise, index) => {
promise.then(data => fulfil({ data, index }), reject);
});
})
);
class Fetcher {
constructor(maxConnections = 20) {
this.maxConnections = maxConnections;
}
async request(urls, options = {}) {
const responsePromises = [];
for (const url of urls) {
if (responsePromises.length >= this.maxConnections) {
const { data: response, index } = await promiseRace(responsePromises);
responsePromises.splice(index, 1);
}
responsePromises.push(fetch(url, options));
}
return Promise.all(responsePromises);
}
}
// test
(async () => {
try {
const fetcher = new Fetcher(2); // лимит 2
const urls = [];
for (let i = 0; i < 200; i++) {
urls.push(`/api/user/${i}`);
}
const responses = await fetcher.request(urls);
console.log('end');
} catch (e) {
console.error(e);
}
})();
При таком подходе, пропадает необходимость использовать app.get(), так как все файлы и так будут отданы. Плюс, смущает факт того, что доступ к файлам можно получить прописав путь напрямую /home/index.html
const valueToDel = 'value1';
for (const n of Object.entries(obj)) {
if (n[1] === valueToDel) {
delete obj[n[0]];
}
}
const newObj = Object
.entries(obj)
.reduce((acc, [ k, v ]) => (v !== valueToDel && (acc[k] = v), acc), {});
// или
const newObj = Object.fromEntries(Object
.entries(obj)
.filter(n => n[1] !== valueToDel)
);
something().then(() => {
something2().then(() => {
})
})
await something();
await something2();
const fs = require('fs');
const { resolve } = require('path');
const { promisify } = require('util');
const writeFile = promisify(fs.writeFile);
const got = require('got');
async function getImage(url)
{
try
{
const { body, statusCode, statusMessage } = await got(url, { encoding: null });
if (statusCode === 200)
{
await writeFile(resolve('.', 'newCaptchaAnchor.gif'), body);
}
else
{
throw new Error(statusMessage);
}
}
catch(err)
{
throw new Error(err);
}
}
getImage('https://developers.google.com/recaptcha/images/newCaptchaAnchor.gif')
.then(() => console.log('Complete....'));
создать ссылку, при переходе по которой можно вручную вытащить токен
https://oauth.vk.com/authorize?...
) с последующим редиректом на https://oauth.vk.com/blank.html
.../blank.html
) и тогда сработать и вытащить оттуда из хэша access_token
.