@zlodiak

Как выводить результат оператора do после основного действия?

Такой код:
Observable.timer(0, 3000).do((v) => console.log('tick', v)).subscribe((r) => {
      console.log(r);
    });


Выводит вот что:
tick 0
0
tick 1
1
tick 2
2
tick 3
3


Но мне непонятно почему в записи оператора do идёт ПОСЛЕ timer, а выводится ДО timer. Можно ли сделать так чтобы результат оператора do выводился после того числа, которое генерирует timer?

И вообще, никто не находит странным действие этого оператора?..
  • Вопрос задан
  • 61 просмотр
Решения вопроса 1
@dmitrygavrish
Оператор do никак не влияет на последовательность, вы просто "вклиниваетесь" в нее, получаете ее текущие данные и можете запустить какие-либо side effects на основании этих данных (результат выполнения функции в do никак не влияет на данные, которые окажутся в следующем операторе, либо конечной подписке). На сам таймер вы подписаны после оператора do, поэтому сначала выполнятся действия в do, затем в subscribe.

Точно также любое действие выполнится в любом другом операторе до того, как вы попадете в subscribe, но другие операторы так или иначе меняют исходную последовательность.

Чтобы добиться нужного вам поведения, можете записать последовательность в переменную и подписаться на нее 2 раза в нужном порядке:
const obs = Observable.timer(0, 3000);
obs.subscribe(i => console.log(i));
obs.subscribe(i => console.log('tick', i));
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы