hmdismail Ответов: 1

Обещания и асинхронные функции в javascript


Я хотел разработать и реализовать функцию RateLimiter, которая позволяет использовать следующее:

насколько я понимаю, когда кто-то звонит do, RateLimiter должен сделать одну из двух вещей с переданной лямбдой:

-Начните выполнять его немедленно-поставьте в очередь для последующего выполнения

В моем случае, если я вызываю dothree раз в быстрой последовательности, первые две асинхронные функции должны быть немедленно запущены, а третья должна быть поставлена в очередь.

Поскольку ограничитель скорости должен контролировать состояние любых асинхронных функций, которые он запускает, он должен установить обратный вызов на возвращенное обещание.

Таким образом, существует по существу два "события", которыми занимается ограничитель скорости:

-Кто-то звонит мне.
-Одна из порожденных задач завершается (успешно или неудачно)

может ли кто-нибудь попытаться его реализовать?

const userList = ['user_a', 'user_b', 'user_c', /* and so on ... */];
const rateLimiter = new RateLimiter({ limit: 2 });
const promises = userList.map((user) => 
    rateLimiter.do(async () => {
        console.log(`Getting user data of ${user}...`);
        const userData = await getHTTP(`https://some-api-with-rate-limit.io/users/${user}`);
        console.log(`Got user data of ${user}.`);
        return userData;
    })
);
const results = await Promise.all(promises);
console.log(results); // [data of user_a, user_b, user_c, ...]


Что я уже пробовал:

I think its easiest to use Promise.finally to do that.



The finally callback will run whether the promise is completed or rejected, so it'll handle both success and failure cases.

When any in-flight async function finishes and my installed Promise.finally handler is called, i will need to determine if there are any queued async functions. If so, i will need to start one.

Gerry Schmitz

Вам нужна задача для мониторинга очереди задач, чтобы только 2 из них были отправлены / запущены одновременно. "RateLimiter" звучит как багаж.

hmdismail

есть ли у вас какие-нибудь идеи не использовать JS async вместо реальных потоков? пример может ли работать workerpool?

1 Ответов

Рейтинг:
0