Pull to refresh

Comments 16

Жесть, вот это уродский код, просто кровь из глаз.
async/await вам в помощь и традиционный подход к программированию, тогда и будет вам счастье.

async/await относится к другой парадигме. RxJs манипулирует потоками данных, а не однократным выполнением.

В данной статье разобрана библиотека RxJs которая уже по умолчанию используется в Angular. Вся архитектура данного фреймворка завязана на ней! Все начинающие ангулярщики это знают и данная библиотека уже идет по дефолту к изучению с этим фреймворком. Ни кто не запрещает использовать async/await  в купе с RxJs но когда вы попадете в реальную компанию то 99% ассинхроности будет реалезовано с помощью данной библиотеке. Ну а об плюсах по сравнению с async/await  можете сами найти в паутине!

Тут скорее кто к чему привык и какая задача стоит, мне, например, гораздо удобнее и понятнее RxJs, нежели async/await и промисы, которые в добавок работают как некая неизбежность - они обязательно так или иначе должны выполнится, а с RxJx можно подписаться на поток когда тебе надо, так же отписаться, получать данные из потока не сразу, а с задержкой, объединять данные с нескольких потоков и ещё много чего. Да, с async/await тоже некоторые подобные штуки можно делать, но выглядеть это будет "не очень", плюс достаточно сложно для прочтения это будет.

Тут скорее кто к чему привык и какая задача стоит, мне, например, гораздо удобнее и понятнее RxJs, нежели async/await и промисы

Да, с async/await тоже некоторые подобные штуки можно делать, но выглядеть это будет "не очень", плюс достаточно сложно для прочтения это будет.

А можно пожалуйста пример из реальной жизни, т.е. то, что в реальности приходится решать разработчикам фронта, хотя бы в среднем на каждом пятом проекте где именно код с RxJs будет понятней/лучше, а традиционная разработка с тем же async/await просто не решит задачу или код будет непонятным по сравнению с RxJs? Прям ссылку на codesandbox/stackblitz пришлите, а я реализую то же поведение, но традиционными методами, просто сравним код хотя бы даже ради интереса. А то всё что я всегда слышу это о каких-то магических кейсах и сценариях где Rx это пушка, но реального сценария я так никогда и не видел где он выигрывает традиционный подход. Надеюсь вы такой сценарий предоставите, главный критерий это реальный, а не вымышленный или 1 на 10000 кейс. Буду очень благодарен.

Чтобы дернуть один запрос с бекенда async, await достаточно, как и в 99% задач фронта. Странно говорить про технологию/методологию что она фигня, ничего в ней не понимая. Код на rx точно ни в каком виде не будет понятнее, если никогда не работал с rx.
Это другая парадигму программирования (реактивное программирование) лично у меня он на фронте не прижился, на проектах был не только я, а порог входа там на голову выше чем async/await и я из мира реакта, а не ангуляра, где rx - дефолт.
Но на беке активно его использовал именно для обработки потоков данных. Вообще выучил его с 0 когда мне нужно было приоритезированную очередь сделать. Могу даже код показать
https://github.com/snicksnk/inst-observer/blob/develop/src/utils/ig-queque/request/requesSheduleFactory.ts
Но естественно ты там ничего не поймешь.
Еще rxjs всегда под капотом у nestjs
Отдельная песня это тестирование марбл диаграммами, это вообще другой подход к разработке, когда ты с потоками данных работаешь, а не с императивными функциями, просто с приставкой await

Но на беке активно его использовал именно для обработки потоков данных

Просто абстрактно и опять 0 конкретики, а именно что тут традиционный подход не канает или код будет нечитемым.

Вообще выучил его с 0 когда мне нужно было приоритезированную очередь сделать

И? При чем тут rxjs если это достаточно тривиальная штука. Опять же 0 конкретики, какая-то абстрактная очередь.

Еще rxjs всегда под капотом у nestjs

И что теперь? А если бы там был под капотом jQuery первой версии? Или Redux?

когда ты с потоками данных работаешь, а не с императивными функциями, просто с приставкой await

Опять максимально абстрактные слова без конкретики и кода.

P.S. Очередное подтверждение, что RxJs не может противопоставить традиционному подходу ничего, от слова совсем. Разве только write-only код, от которого кровь из глаз льется

Конечно абстрактно, мы про абстракции и говорим
Во первых rx и async/await сравнивать это бред. Давай хотя бы rx и промисы сравнивать, а не их обертку.
Во вторых: В чем измерять читаемость? Какие единицы измерения? Или если не понимаешь значит по определению плохо?
Пример неста, как очень меинстримового решения и rxjs под капотом это как раз более объективная метрика успешности rx чем читаемость кода конкретно тобой.
Там и промисы с await и rx уживаются по тому что хорошо решают разные задачи.
Ты можешь реализовать (момент про тривиальность улыбнул) асинхронную, конкурентную, приоритизированную очередь использую только Promise.all, .race, .any. И все. А можешь использовать пару десятков уже готовых функций (включая аналоги этих 3х) для работы с потоками данных https://rxmarbles.com/
Я там писал выше что кнопки красить и простой json гонять можно и без rx. Если ты не сталкиваешься с задачами, которые решает rx, это не значит что он плох, я к этому веду

Зато с rxjs можно локаничненько сделать retry для http запросов. Типо как

defer(() => this._telegraf.telegram.sendDocument(this._chatID, url, { caption, }), ) .pipe(retry({ count: 3, delay: 5 * 1000 })) .subscribe({ next: async (value) => { if (value?.message_id) await this.cache.set(`${MESSAGE_ID_PREFIX}_${value.message_id}`, { text: caption }); }, error: (error) => { const errMessage = `Error: ${error}. File url: ${url}`; this.logService.error(errMessage); this.sendAlert(errMessage); }, });

А больше плюсов для рядовых задач я пока не нашел))

Зато с rxjs можно локаничненько сделать retry для http запросов. Типо как

Или так) Без rx'ов))

fetchData = async () => {
  this.fetching = true;
  try {
    this.items = await new ApiReq(`GET /api/v1/docs`).withRetries(3, 5000).send();
  } catch (e) {
    this.error = e.message;
  } finally {
    this.fetching = false;
  }
}

А больше плюсов для рядовых задач я пока не нашел))

Так и эта "фича" элементарно реализуется без rx'ов =) 10 минут и готово)

соединение с сокетом и получить два разных потока данных

const getWs = (dataType) => {}
getWs(dataOne).pipe(takeUntil(unSubcribeSubject)).subscribe()
getWs(dataTwo).pipe(takeUntil(unSubcribeSubject)).subscribe()

вот давайте традиционным способом getWs, и чтоб можно было отписаться, мы же не хотим утечек?



соединение с сокетом и получить два разных потока данных

Что конкретно вы тут подразумеваете под потоком данных? Каждое соединение/клиента который приконнектился и шлет данные или все подряд данные которые шлют все клиенты или что?

Вообще звучит как обычный EventEmitter))
const unsibscribeFn1 = wsEvents.on('data', dataOne);
const unsibscribeFn2 = wsEvents.on('data', dataTwo);

Ну и когда надо отписываемся
unsibscribeFn1();
unsibscribeFn2();

вот вы и ответили на вопрос, зачем нужен rxjs. это не промисы, а работа с потоками данных. ТК вы сами в этой абстрактной задачи используете евентимитер. не надо говорить что, что то плохое, если не умеет это готовит и использовать. ТК в вы в своем примере применили все тот же паттерн что используется в Rx. и в вашем примере нет и строчки про промисы)

RxJs есть одна маленькая проблемка, современные генераторы (function*) делают всё тоже самое но лучше, ну вернее производительнее и точно так же не очевидно, поэтому в нем особо нет смысла

Sign up to leave a comment.

Articles