Kanat
спасибо
Alexey
Кто нибудь делал очередь запросов на async await?
Artur
Да, я делал
Artur
Какой-то конкретный вопрос есть?
Alexey
ну суть в том что бы сделать так называемый пул запросов, что бы обеспечить выполние запросов не параллельно, а в очереди. т.е задача какая, выполняю запросы к вк и нужно учесть лимиты, и делать запросы с интервалом 300 миллисекунд. на промисах уже делал, есть кейс который год использую. щас интересно сделать на async await
Artur
А это в принципе тоже самое.
Artur
Просто co меняешь на async function и yield на await заменяешь.
Alexey
ну вот у меня был метод для создания запроса call(method, params) { defaults(params, { v: this._v }); return new Promise((resolve, reject) => { this._queue.push({ method, params, resolve, reject }); if (this._queue.length > 0) { this._callNext(); } }); } а когда он выполнится соответственно resolve/reject произойдет с асинком хз как
Artur
Кстати, я писал для внутренней системы очередь (постраничная обработка списков), но у меня была конкуренция без таймаутов.
Artur
Ну похоже.
Artur
while { queue.push(promisedTask) await Promise.all(queue) }
Artur
Типа такого
Artur
Хотя в случае с таймаутами нужна другая идеология.
Alexey
ну я то хочу вообще от промисов избавится
Artur
Кстати, тут вопрос в подходе. async/await в принципе нужен для последовательного выполнения запросов.
Artur
И они в любом случае работают поверх промисов.
Artur
Почему?
Alexey
просто переписать все на async await, если это возможно
Artur
async/await работает над промисами
Artur
Он нужен для последовательной обработки операций. Очередь это не последовательная обработка операций а конкурентная.
Artur
В вашем случае еще и с лимитами на ops
Artur
т.е. я вообще изначально неправильно наверное понял. очереди где используется async/await и очереди которые без промисов (тогда там что, коллбэки?), противоречат смыслу асинхронности очередей (если в них операции параллельные, а не последовательные).
Artur
Ожидать завершения очереди через await - одно, внутренний механизм очередей на async/await - совсем другое.
Artur
Еще раз глянул код.
Artur
В данном случае очередь простейшая последовательная.
Artur
Я правильно понял?
Artur
Главное не выйти за лимит?
Artur
Тогда все просто
Artur
Я бы вообще это очередью не назвал. Тут даже не надо в очередь добавлять задачи.
Artur
Просто код из callNext выносишь в cal
Artur
*в call
Artur
Добавляешь глобальный каунтер
Artur
timeLimit = ms и opPerSec = sec потом проверяешь набрал лимита или нет, если набрал делаешь await функции которая кинет промис с таймаутом до окончания лимита.
Alexey
ну твоя идея в том что бы если летит 1000 запросов, сразу вешать 1000 таймаутов?
Artur
Нет
Artur
Увас операции последовательные же
Artur
Какая разница какой размер пула?
Artur
Могу накидать пример
Artur
В общем виде
Alexey
если два таких запроса сделать что будет? doSomething([ 'http://ya.ru/?1', 'http://ya.ru/?2', 'http://ya.ru/?3', 'http://ya.ru/?4', 'http://ya.ru/?5', 'http://ya.ru/?6', 'http://ya.ru/?7', 'http://ya.ru/?8', 'http://ya.ru/?9', 'http://ya.ru/?10', ]); doSomething([ 'http://ya.ru/?1', 'http://ya.ru/?2', 'http://ya.ru/?3', 'http://ya.ru/?4', 'http://ya.ru/?5', 'http://ya.ru/?6', 'http://ya.ru/?7', 'http://ya.ru/?8', 'http://ya.ru/?9', 'http://ya.ru/?10', ]);
Alexey
параллельное выполнение правильно?
Artur
А зачем так?
Artur
while ... await doSomething(urls)
Artur
Это если несколько списков
Artur
У меня есть такой сервис, который получает список по API с лимитом 100, добавляет его в очередь и пока не выйдет следующую страницу не выбирает.
Alexey
у меня вообще нет списков. у меня сервис, который в разных своих частях дергает апи.
Artur
Только у меня не лимит на время, а лимит на конкуренцию
Artur
Ну тоже самое
Artur
Ну тогда чуть-чуть переделать
Artur
Можно вот по задаче вопрос
Artur
Это получается типа пула к MySQL?
Artur
Есть адаптер некий, куда поступают запросы, на которые стоят лимиты
Artur
ПравильнО?
Alexey
ну смотри, я когда то давно для ионика писал. https://gist.github.com/beautyfree/670dd714aade3301e46d щас просто хочется по приятнее как нибудь сделать. а то везде код чистенький красивенький, а это выглядит как то сложно уже.
Alexey
там ограничение 3-4 запроса в секунду. т.е по сути нужно делать запросы с интервалом 300 миллисекунд
Artur
А, ну тогда еще проще
Artur
Просто это переосмыслить надо
Alexey
надо генераторы заюзать и на async await перейти. тогда наверное интересная штука получится)
Kanat
с помощью ecmascript можно приложение на android написать?)
Kanat
Alex
Ionicframework.com
Artur
Разные подходы
Artur
Разные задачи
Artur
Кстати, без очередь промисов в вашем случае все равно не обойтись.
Kanat
+ React Native и прочая Cordova
Ты писал приложение с помощью ecmascript?
Artur
Потому что вам надо во внешней функции ждать результата исполнения запроса, а без промиса или коллбэка ее не подождать.
Artur
https://github.com/yortus/asyncawait вот тут интересное по теме есть
Artur
Правда там своя реализация async/await.
Kanat
Kanat
Пиздато
Artur
самое то, когда надо быстренько наговнокодить)
Artur
Ну я и говорю, самое то, когда надо быстренько)