1
00:00:06,799 --> 00:00:11,080
Hello, Welcome to Adventures and Angular. It's been a while. This is

2
00:00:11,160 --> 00:00:15,519
the podcast where you keep you updated
on all things Angular related. This show

3
00:00:15,640 --> 00:00:18,879
is produced by two companies, Top
and Doves and Onoid. Top and Doves

4
00:00:18,920 --> 00:00:22,079
is where we great Top and Doves
we get top and pay and recognition while

5
00:00:22,120 --> 00:00:27,280
working on interesting problems and making meaningful
community contributions. And Onvoid, which offers

6
00:00:27,399 --> 00:00:31,440
more design and software development services on
a task basis, so clients only pay

7
00:00:31,480 --> 00:00:37,359
when tests are delivered and approved.
In today's episode, we will talk about

8
00:00:37,920 --> 00:00:43,799
reactiveness and Angular and how you can
still use urxgs, so that's correct.

9
00:00:43,920 --> 00:00:48,000
We're not necessarily going to talk about
signals today, although we might touch on

10
00:00:48,039 --> 00:00:56,479
the subject, but how you can
simplify your reactivity while still using rxgs and

11
00:00:57,119 --> 00:01:03,040
well, for that we have a
variouspect guests. So Dean Radcliffe is a

12
00:01:03,239 --> 00:01:07,879
web developer of many years and the
creator of our ex facts, which is

13
00:01:08,000 --> 00:01:14,400
the library we're going to be talking
about throughout this episode. So we're going

14
00:01:14,480 --> 00:01:19,239
to get back to Dean in a
second. But also joining me in today's

15
00:01:19,239 --> 00:01:26,319
episode is Arman Vardanian. Hey,
everyone, first episode this year. I

16
00:01:26,439 --> 00:01:32,319
missed you, yeah, and well
I am Lucas Paganini, one of the

17
00:01:32,480 --> 00:01:40,680
other hosts in the show. So
let's get started. So Dean, yes,

18
00:01:40,719 --> 00:01:47,920
sir, please pitch our XFCX to
the audience. All right, our

19
00:01:48,079 --> 00:01:57,760
xffcts, that's our ex FX is
framework independent state management and effect management with

20
00:01:57,920 --> 00:02:04,040
concurrency control like our extra has,
and it is built on r XJS.

21
00:02:04,280 --> 00:02:09,199
It's interoperable with r XJS, but
it brings a better developer experience and a

22
00:02:09,319 --> 00:02:15,560
shorter learning curve than using only r
x JS. Compared to r xjs,

23
00:02:16,039 --> 00:02:23,639
RX effects will still concurrency control your
ACYNC functions like with those concat map switch

24
00:02:23,759 --> 00:02:28,919
map operators, but in a way
that will be simpler, safer, and

25
00:02:29,080 --> 00:02:35,479
with greater readability. Okay, that's
really interesting, And I was I was

26
00:02:35,560 --> 00:02:39,199
actually taking a look at the MEPO
so the route. I noticed that,

27
00:02:39,400 --> 00:02:44,879
like in the peckyjson file, you
don't have RXS as a dependency. So

28
00:02:45,800 --> 00:02:49,120
I do have our xs as a
dependency, but not in the root.

29
00:02:50,000 --> 00:02:55,520
Oh not in the route. Okay, repository is a is a the it's

30
00:02:55,560 --> 00:03:04,800
a like Lucas said, there's an
installation of libraries and they the primary ones

31
00:03:04,919 --> 00:03:10,280
are going to be RX effects,
slash bus, RX effects slash effect and

32
00:03:10,639 --> 00:03:20,240
rx effects slash service, and they
each provide similar reactive and concurrency control benefits,

33
00:03:21,400 --> 00:03:28,039
but with a little bit of a
flavor and different different mental models.

34
00:03:28,280 --> 00:03:31,800
So, for example, the bus
is an event bus. It was actually

35
00:03:34,479 --> 00:03:43,639
derived from a simple rx JS event
bus that the company I don't know,

36
00:03:43,719 --> 00:03:46,360
somebody posted I can't remember the name
or the exact company name it was.

37
00:03:46,919 --> 00:03:51,240
I had to do with the RxJS
creators. There was a simple event bus,

38
00:03:51,800 --> 00:03:57,520
and then I built on that event
bus, and the event bus brings

39
00:03:57,800 --> 00:04:02,439
pub sub benefits. So so that's
like you trigger an event somewhere and an

40
00:04:02,479 --> 00:04:09,080
event listener responds by running an async
function, but that listener can be concurrency

41
00:04:09,199 --> 00:04:14,960
controlled. So imagine having your RxJS
operators kind of baked in to the listener.

42
00:04:15,560 --> 00:04:23,000
So that's the bus model. It
has the advantage of your code that's

43
00:04:23,079 --> 00:04:29,279
triggering events. Say you have a
component that triggers an event when it's clicked

44
00:04:29,399 --> 00:04:33,319
to save something to a database.
But now you want to send an analytics

45
00:04:33,399 --> 00:04:39,680
event that that button was clicked,
right, So the published subscribe pub sub

46
00:04:39,839 --> 00:04:45,120
metaphor says you don't have to go
into that component with the button and add

47
00:04:45,199 --> 00:04:49,480
code to it you can listen for
that click event with a bus listener and

48
00:04:51,480 --> 00:04:57,000
then you know, send analytics events
that way. And I've done this on

49
00:04:57,120 --> 00:05:00,560
an application that had many many questions
gens. It was a survey application,

50
00:05:01,319 --> 00:05:06,800
and the goal was that once we
developed a question type that we wanted to

51
00:05:06,959 --> 00:05:13,720
keep that component closed like closed to
modification, we should be able to extend

52
00:05:14,680 --> 00:05:19,959
the behavior of the components without having
to go in and modify the components.

53
00:05:20,480 --> 00:05:25,439
And so by having each component put
an event on the event bus, it's

54
00:05:25,519 --> 00:05:30,279
easy to add event listeners like an
analytics listener. And suppose you want to

55
00:05:30,360 --> 00:05:36,160
say your analytics events should be sent
serially so that they don't take up more

56
00:05:36,240 --> 00:05:40,800
than one HTTP connection at a time, Well, then you just set the

57
00:05:40,879 --> 00:05:46,839
concurrency mode of that listener. And
that also gets you out of the pickle

58
00:05:47,240 --> 00:05:51,800
of you if you were to modify
the component and you'd have some code that

59
00:05:51,920 --> 00:05:56,959
says save to the database and some
code that says analytics, Well, is

60
00:05:57,000 --> 00:06:00,399
there a correct order to put those
calls? And if you put the analytics

61
00:06:00,480 --> 00:06:05,240
call first and that analytics call errors
for some reason, is that going to

62
00:06:05,360 --> 00:06:09,759
keep it? Are you going to
keep from needing to you know, is

63
00:06:09,759 --> 00:06:14,639
that going to prevent the database call
from functioning. So it's actually much cleaner

64
00:06:15,120 --> 00:06:18,560
not to keep piling things into the
one component, but to set up separate

65
00:06:18,639 --> 00:06:25,279
listeners. And another benefit of our
x effects is error handling. So if

66
00:06:25,360 --> 00:06:31,360
that analytics event listener acts up,
it doesn't kill the safe to database event

67
00:06:31,480 --> 00:06:39,519
listener. So you have separation through
the pub sub metaphor like even more complete

68
00:06:39,600 --> 00:06:46,639
separation and error handling then with raw
rx JS. That's really that's really interesting

69
00:06:46,759 --> 00:06:53,040
because in ourhgs, error handling can
be a bit of a pain point for

70
00:06:53,160 --> 00:06:59,600
lots of developers, Like there are
are all of those tools. For example,

71
00:07:00,519 --> 00:07:03,720
we have retry, retry when right
with the count we have, we

72
00:07:03,800 --> 00:07:10,439
could just schedule and so on,
but some some of those tools, especially

73
00:07:10,480 --> 00:07:15,480
I think from the perspective of the
documentation, aren't readily like obvious that those

74
00:07:15,879 --> 00:07:20,519
can be used for airror handling.
And yeah, I'll honestly see lots of

75
00:07:20,560 --> 00:07:25,480
people who have worked with the ourgis
for a while, but they would probably

76
00:07:25,519 --> 00:07:30,319
get confused by like what means we
try when mm hmmm or something, or

77
00:07:30,360 --> 00:07:36,000
how to what scenarios you can have
with you know, error handling. So

78
00:07:36,680 --> 00:07:41,199
yeah, there's this's this really sounds
interesting. I'm just taking a look at

79
00:07:41,240 --> 00:07:49,439
the effects library. Yeah yeah,
Well you mentioned pain points with our x

80
00:07:49,560 --> 00:07:56,480
g S and I was at a
conference which side is a four years ago

81
00:07:56,759 --> 00:08:01,439
called our x JAS Live, and
I basically follow the RxJS core team and

82
00:08:01,759 --> 00:08:09,199
I follow and listen to what people
say the top pain points are with r

83
00:08:09,319 --> 00:08:11,680
x JS, and of course as
I hear them, I think, well,

84
00:08:11,720 --> 00:08:16,639
maybe I could address that in rx
effects, and I believe I have,

85
00:08:16,920 --> 00:08:22,040
and so I'll touch on some of
them. Tracy Lee and Ben Lesh

86
00:08:22,600 --> 00:08:28,279
and j phelps the core people that
give workshops on r x JS. What

87
00:08:28,519 --> 00:08:33,279
they're suggesting you can, you know, get stuck on in which they'll help

88
00:08:33,320 --> 00:08:37,639
you with. But our x effects
will also help you with. Is okay,

89
00:08:37,799 --> 00:08:41,240
So subscription management, when do you
subscribe? What do you do with

90
00:08:41,360 --> 00:08:48,480
subscription objects? How do you choose
an operator? And is can cat map

91
00:08:48,679 --> 00:08:56,759
or exhaust map correct for your case? And error handling? So I think

92
00:08:56,799 --> 00:09:03,240
subscriptions, concurrency, and error handling
are some of the biggest problems challenges people

93
00:09:03,360 --> 00:09:11,080
have with r x JS, and
our XFX has has solutions to all of

94
00:09:11,159 --> 00:09:18,320
those with a simpler, developer friendly
API. Oh one thing that I'm still

95
00:09:18,399 --> 00:09:24,440
wondering about. Like, I'm seeing
lots of different examples in the repole,

96
00:09:24,440 --> 00:09:31,759
and I see very little RXGS in
actuality. So is this meant to be

97
00:09:31,919 --> 00:09:37,919
like a sort of total wrapper around
rh just like you don't really need to

98
00:09:37,080 --> 00:09:46,440
touch RGS itself for yes, but
but you can grow to use all of

99
00:09:46,519 --> 00:09:52,000
the r xjs features. It's truly
interoperable. But so in the show notes,

100
00:09:52,120 --> 00:09:58,879
I provided a link to a stack
overflow post where I said, here's

101
00:09:58,919 --> 00:10:03,840
a situation. You have a bell
ringing function. It plays some audio,

102
00:10:03,080 --> 00:10:09,639
and so it's async because it takes
some time. Now you want to create

103
00:10:09,840 --> 00:10:13,879
a web form with a button that
rings the bell. Now, if that

104
00:10:15,159 --> 00:10:20,679
button is wrung or clicked while the
bell is ringing, you would have two

105
00:10:20,759 --> 00:10:24,279
bells ringing at once, and it
might overload your audio and sound bad.

106
00:10:24,440 --> 00:10:30,320
So we want to concurrency control the
bell like put them in a queue,

107
00:10:31,120 --> 00:10:33,919
or cut off the previous bell,
or throttle like. So we want a

108
00:10:35,000 --> 00:10:39,799
concurrency control mechanism. And we also
want cancelation because what if the user just

109
00:10:39,840 --> 00:10:45,600
wants to cancel on that bell.
Simple example, there's a there's one button

110
00:10:45,759 --> 00:10:50,600
to ring, one button to cancel
and a concurrency control. Well, I

111
00:10:50,840 --> 00:10:56,320
sketched out what I thought the RxJS
version of that was, and it was

112
00:10:56,399 --> 00:11:05,480
about about fifteen lines. There were
two subjects, there were various imported operators

113
00:11:05,600 --> 00:11:11,080
take until there actually needs to be
three subjects, uh take until a switch

114
00:11:11,200 --> 00:11:16,000
map. It was. It was
what I call operator soup and the rx

115
00:11:16,080 --> 00:11:22,720
effects. Given a function that returns
a promise or an observable for ringing the

116
00:11:22,799 --> 00:11:28,200
bell the audio, it's you know, one line to wrap it in uh

117
00:11:28,799 --> 00:11:33,919
an effect with the create effect function, and it's one line to request it,

118
00:11:33,080 --> 00:11:37,320
which is the same for r XJS, one line to like trigger the

119
00:11:37,399 --> 00:11:43,480
bell ringing. But then cancelation is
just dot cancel current and canceling. The

120
00:11:43,639 --> 00:11:50,279
entire queue is dot cancel, current
and queue. So it's a question of

121
00:11:50,360 --> 00:11:56,120
when should you like deep dive into
r x JS. Well, if you

122
00:11:56,240 --> 00:12:00,480
want to tap something, if you
want to do retry, when if you

123
00:12:00,519 --> 00:12:03,480
want to use any of the fancy
operators, if you want to zip two

124
00:12:03,759 --> 00:12:09,799
services together, that's fine. But
as far as concurrency control and cancelation,

125
00:12:09,879 --> 00:12:15,639
like you shouldn't need to go into
that much detail or have that many imports,

126
00:12:15,759 --> 00:12:18,840
Like think about load dash, how
you just take your function, pass

127
00:12:18,919 --> 00:12:24,559
it into a load dash function,
and get a new function out that has

128
00:12:24,639 --> 00:12:28,159
new behavior. It should be that
simple. That's the premise of OURXFX.

129
00:12:31,039 --> 00:12:35,200
So once really got me interested when
I was thinking about this in the context

130
00:12:35,240 --> 00:12:41,000
of Angular and jar X. Could
I, for example, and I will

131
00:12:41,399 --> 00:12:46,120
tell you in a moment why I'm
asking this, Like I have an observable

132
00:12:46,240 --> 00:12:50,960
that does something something, Can I
just pick it up and turn it into

133
00:12:50,000 --> 00:12:56,120
an effect? Like I already have
an observable that works in a certain way

134
00:12:58,200 --> 00:13:03,759
that I want to sort of turn
into in an RX affects effect to be

135
00:13:03,080 --> 00:13:07,559
able to I don't know, cancel
it or add something to it, or

136
00:13:07,320 --> 00:13:16,960
pose it or whatever capabilities it offers. Do you have the observable as like,

137
00:13:18,039 --> 00:13:22,240
do you have a function that returns
an observable like an endpoint that returns

138
00:13:22,919 --> 00:13:28,639
an AJAX observable, Like I mean
a function that returns an ajax observable observable?

139
00:13:30,000 --> 00:13:31,720
Yeah? Let me yeah, let
me just give you the exact thing

140
00:13:31,799 --> 00:13:35,799
that I was that I had in
moment. So for example, in JRX,

141
00:13:35,879 --> 00:13:39,840
we have the jur affects package,
and it's very decent to create like

142
00:13:39,960 --> 00:13:45,600
effects based on actions and so on, but it doesn't have very many features.

143
00:13:45,679 --> 00:13:50,960
So essentially it provides with the function
to sort of register and observable that

144
00:13:50,559 --> 00:13:56,519
j RX will listen to whatever you
wanted to do, and it gives you

145
00:13:56,159 --> 00:14:03,639
the actions observable like whatever actions have
in your I don't know application, and

146
00:14:03,759 --> 00:14:07,320
you just mix them and then you
have to go and use a bunch of

147
00:14:07,480 --> 00:14:11,480
rs if you want something complex like
ninety scenarios, just like I make an

148
00:14:11,559 --> 00:14:16,919
HDP request and despatch this or that
action. But sometimes you need like oh,

149
00:14:16,279 --> 00:14:22,720
I want to retry this, is
this something specific appensode or maybe in

150
00:14:22,879 --> 00:14:26,399
some cases I want to throw away
the previous requests start a new one.

151
00:14:26,480 --> 00:14:30,200
But in other scenario, I want
to do something else, and it becomes

152
00:14:30,320 --> 00:14:33,240
as you mentioned, like an operator
soup. In the effects it becomes really

153
00:14:35,399 --> 00:14:37,799
so. And the funny thing is
like injr X, when you create an

154
00:14:37,840 --> 00:14:43,200
effect, like you have functional effects. Now you have a variable that represents

155
00:14:43,279 --> 00:14:46,240
this effect, but you never use
it. It would be great if you

156
00:14:46,559 --> 00:14:52,000
could bring it to your component and
for example, in some scenario button less

157
00:14:52,039 --> 00:14:54,399
click and you could say, okay, cancel this effect or pose this effect

158
00:14:54,559 --> 00:14:58,600
or something in that regard. So
I was thinking if I could take this

159
00:14:58,720 --> 00:15:03,279
egg observable that that is the thing
that I need from juris. I need

160
00:15:03,360 --> 00:15:05,919
to know what actions have. Yeah, and just I don't know, plug

161
00:15:07,000 --> 00:15:13,519
it into this effect and maybe use
it this way. So okay, I'm

162
00:15:13,639 --> 00:15:20,679
still maybe, but let me help
clarify it. So there are observables that

163
00:15:20,919 --> 00:15:24,879
are like the sources of effects running
and is that what? There is one

164
00:15:24,960 --> 00:15:30,799
observable, Yeah, Jelicks gives you
one observable. It's called actions actions where

165
00:15:30,799 --> 00:15:33,799
an action is dispatched somewhere this action, will you know, send the new

166
00:15:33,840 --> 00:15:39,960
EMISI. So actions that sounds that
sounds like a hot observable. Yes,

167
00:15:39,000 --> 00:15:45,720
that right, Okay, it's a
hot observable. So with you generally wouldn't

168
00:15:46,559 --> 00:15:54,799
have that wrapped in RX effects.
You would you would maybe trigger some effects

169
00:15:54,399 --> 00:16:00,200
based on a filtered set of actions, right, yeah. So so you

170
00:16:00,240 --> 00:16:04,879
have observables like that that are hot
and they are like the sources of information.

171
00:16:06,720 --> 00:16:11,080
And then you have observables that I
usually call cold, that are like

172
00:16:11,879 --> 00:16:15,600
doing the effect, doing the AJAX, ringing the ball in the in the

173
00:16:15,799 --> 00:16:21,399
context, in the context of the
specific what ang X does. It gives

174
00:16:21,440 --> 00:16:26,840
you a custom operator called off type
and you can pass it actions that you

175
00:16:26,960 --> 00:16:30,399
want. I want this action for
example, if the load data action was

176
00:16:30,480 --> 00:16:36,320
triggered, then it will all sort
of filter out and only start working.

177
00:16:36,440 --> 00:16:41,679
And then you give this entire thing
to the create effect function that AnGR x

178
00:16:41,720 --> 00:16:45,039
does, and then it reduces these
facts. I think it has one or

179
00:16:45,080 --> 00:16:49,360
two methods that you can use.
You can definitely it has methods using human

180
00:16:49,440 --> 00:16:53,399
testing like but the object that it
returns itself, it doesn't have very many

181
00:16:53,480 --> 00:16:59,279
other useful things. So that's what
got me wondering that sort of enhance.

182
00:16:59,360 --> 00:17:03,839
It just you the same pattern but
instead just fed this effect to something from

183
00:17:04,039 --> 00:17:10,200
RX effects, so that I will
be able to try stuff on demand or

184
00:17:11,519 --> 00:17:15,759
you know, sort of modified concurrency
or whatever without going deep into RGS operators.

185
00:17:17,440 --> 00:17:21,000
Yes, I mean, I hope
so. But my big disclaimer is

186
00:17:21,079 --> 00:17:25,680
that I don't work in Angular much
these days, though I have, and

187
00:17:26,319 --> 00:17:33,400
I developed this library when I was
consulting and switching between Angular and React,

188
00:17:33,960 --> 00:17:37,400
and so I wanted something that was
portable I could take with me. So

189
00:17:37,680 --> 00:17:41,880
as far as how to make this
interact with n g r X, I

190
00:17:42,119 --> 00:17:48,079
have not explored that use case,
but my general sense of it is that

191
00:17:48,880 --> 00:17:56,440
you would have any effect like ringing
a bell. You would have your actions

192
00:17:56,480 --> 00:18:02,119
of type, and then you would
basically subscribe to those actions of type and

193
00:18:02,279 --> 00:18:06,559
say when those come through, ring
the bell, and now you have a

194
00:18:06,640 --> 00:18:11,640
concurrency controlled cancelable bell. On the
one hand, it's independent, and then

195
00:18:11,680 --> 00:18:17,119
you might use RxJS if your actions
are not U n g r X.

196
00:18:17,519 --> 00:18:22,559
If your actions were already available through
n g RX, then you could just

197
00:18:22,799 --> 00:18:26,680
you know, send them to the
to the service or effect. So that's

198
00:18:26,759 --> 00:18:30,319
probably how it would work, but
I haven't tried it. Yeah, that's

199
00:18:30,359 --> 00:18:33,319
interesting. Like from the top of
my head, what I could do is

200
00:18:33,559 --> 00:18:37,440
create one and jr X SOCI just
takes all actions and sentences to like x

201
00:18:37,519 --> 00:18:42,880
effects service. Sounds like effect service, yeah or yeah. And so what

202
00:18:42,960 --> 00:18:45,880
would be different is like, if
you were doing this purely an n g

203
00:18:47,119 --> 00:18:52,200
RX to cancel the bell ringing,
you might have another action that you would

204
00:18:52,359 --> 00:18:56,400
dispatch to do it. But with
rx effects you wouldn't need that. You

205
00:18:56,400 --> 00:19:00,839
would just go to the ringing bell
service or effect and just say dot cancel

206
00:19:00,920 --> 00:19:07,519
current. So in some in some
ways it factors some things out of the

207
00:19:07,759 --> 00:19:15,640
rx JS g r X land that
you don't necessarily need to live in that

208
00:19:15,839 --> 00:19:19,960
land. So for example, the
the like I just said, cancelation,

209
00:19:21,160 --> 00:19:22,960
you can just go directly to the
ringing bell and cancel it, right.

210
00:19:25,440 --> 00:19:29,480
But another thing is the status of
whether the bell is ringing or not.

211
00:19:29,640 --> 00:19:33,319
And there's a linked code sandbox in
the RX effects documentation that has one of

212
00:19:33,359 --> 00:19:37,920
these bells you can play with,
but you want to be able to display

213
00:19:37,000 --> 00:19:41,319
to the user whether the bell is
ringing or not. And prior to my

214
00:19:41,960 --> 00:19:51,359
prior to my working on RX effects, almost and almost every app I did,

215
00:19:51,960 --> 00:19:56,519
I had a field in state called
loading right or for a bell ringing,

216
00:19:56,559 --> 00:20:02,039
I would explicitly code that into the
state model. But then I said,

217
00:20:02,480 --> 00:20:06,559
well, if you've got a promise
that isn't resolved, if you've got

218
00:20:07,079 --> 00:20:11,839
a bell that's still ringing, how
come we don't automatically have access to a

219
00:20:11,960 --> 00:20:17,079
field, like how do I have
to build that into the state model of

220
00:20:17,440 --> 00:20:19,880
my app? Because the problem with
that is, you know, you have

221
00:20:21,119 --> 00:20:23,960
all these examples that say, all
right, well you're gonna have an angular

222
00:20:25,039 --> 00:20:30,359
component that has a button and then
you're going to use the HTTP client to

223
00:20:30,720 --> 00:20:33,119
you know, fetch some stuff.
So the first thing you do is you're

224
00:20:33,160 --> 00:20:37,160
gonna, you know, set is
loading to true, then you're going to

225
00:20:37,240 --> 00:20:40,920
do the effect. Then when it's
done, you're going to set is loading

226
00:20:41,000 --> 00:20:45,720
to false. And that manual tracking
of the loading state is bundled into RX

227
00:20:45,759 --> 00:20:49,319
effects. You can track the loading
state. So I also have an example

228
00:20:49,680 --> 00:20:53,880
of a counter that's asynchronous. It
takes two seconds to increment the counter,

229
00:20:55,720 --> 00:21:00,440
and the state model only contains the
count, but RX effects keeps track of

230
00:21:00,480 --> 00:21:07,799
whether it's executing or not. Yeah, that's what I was And of course

231
00:21:07,920 --> 00:21:15,799
we will now inevitably stumble into the
signals topic because I was just yeah,

232
00:21:15,839 --> 00:21:19,799
because you know, signals got now
very deep integration despite them being not being

233
00:21:21,039 --> 00:21:25,200
like even one year old. But
we have now njr X signals, so

234
00:21:25,319 --> 00:21:30,279
we can build your yeah like state
management without like without the reduct spattern,

235
00:21:30,440 --> 00:21:37,240
just with signals without observables. And
I was thinking, like, the weak

236
00:21:37,359 --> 00:21:42,279
point for me in NJRX signal is
probably the fact because effects are essentially the

237
00:21:42,400 --> 00:21:48,359
same that we have in angoric effects
just baked into you know the signal land.

238
00:21:49,240 --> 00:21:53,000
Yeah, and yeah, that got
me thinking, especially with the loading

239
00:21:53,079 --> 00:21:59,759
example, because there you will have
to do like even more work because you

240
00:21:59,839 --> 00:22:06,839
are inside a signal state, and
like you start an HTP goal for instance,

241
00:22:06,960 --> 00:22:10,799
you have to go like patch state
loading through something like that, and

242
00:22:10,880 --> 00:22:14,319
then you will have to you will
always have to add this line of code

243
00:22:14,359 --> 00:22:22,720
and the other line that's something like
finalized patch state loading falls. And it's

244
00:22:22,759 --> 00:22:27,759
not a pattern that I personally like. And you can't sort of make a

245
00:22:27,920 --> 00:22:34,279
generic function that doesn't because of the
loading state can be different depending on whatever

246
00:22:34,480 --> 00:22:38,759
you are trying to accomplish, unless
it resorts some magic strings or something.

247
00:22:38,839 --> 00:22:42,519
But that's not a good solution to
that. But I mean, yeah,

248
00:22:42,799 --> 00:22:51,079
we've had promises since twenty fifteen and
nine years later, like how come we

249
00:22:51,200 --> 00:22:56,079
don't have like an abstraction that just
automatically knows, Like how come we're still

250
00:22:56,119 --> 00:23:00,839
writing manual loading states, Like why
don't we have an abstraction that knows whether

251
00:23:00,920 --> 00:23:07,640
it's executing or not and is cancelable
if the endpoint of course returns an observable

252
00:23:07,720 --> 00:23:12,359
Because promises are not so simple to
cancel as observables. And that's one of

253
00:23:12,400 --> 00:23:18,880
the greatest things about observables, and
I'm super geeked on observables. They're coming

254
00:23:18,960 --> 00:23:25,720
into the language, into the browsers
are starting to integrate it slightly different API

255
00:23:26,000 --> 00:23:29,519
than r XJS observables. I'm still
learning about, like how am I going

256
00:23:29,599 --> 00:23:36,599
to have to adjust my code when
when those come into play? But but

257
00:23:36,720 --> 00:23:41,599
it's it's I mean, our XJS
is a tremendous library. If I could

258
00:23:41,640 --> 00:23:48,640
give your listeners a little history lesson
of ASYNC, I did a little research

259
00:23:48,799 --> 00:23:59,640
to find out like how rx JS
and promises evolved and and could I I

260
00:23:59,680 --> 00:24:04,319
could do that an hour later.
I mean, I mean we sort of

261
00:24:04,680 --> 00:24:07,799
can. Yeah, but it's intastic. I've never thought about it this way

262
00:24:07,880 --> 00:24:12,920
because I've never really worked with promises. I have worked with pies since I

263
00:24:14,559 --> 00:24:18,880
since I started doing while I worked
with promises when I was doing Angular jes,

264
00:24:19,279 --> 00:24:23,480
we didn't have like we don't know
much about urges back then then Angular

265
00:24:23,599 --> 00:24:29,680
two drops in twenty sixteen, and
yeah, since then, I've not really

266
00:24:29,920 --> 00:24:34,880
touched promises that much unless I was
I don't know, teaching someone about them

267
00:24:36,240 --> 00:24:38,559
or stuff. I was really using
them in the cold. But it never

268
00:24:40,440 --> 00:24:45,319
like I just thought, you know, promises are sort of weak and observables

269
00:24:45,319 --> 00:24:48,279
are very powerful, and I can
do HTP cols with observable that yeah,

270
00:24:48,279 --> 00:24:52,880
I don't care about promises. No, I mean that's that's actually very true,

271
00:24:52,920 --> 00:24:57,759
and I don't think it's judgmental or
critical at all. Promises you could

272
00:24:57,799 --> 00:25:03,680
say, are a subset of observables, definitely right, and so you can

273
00:25:03,759 --> 00:25:07,640
build the promise with an observable,
but the reverse is not true. And

274
00:25:10,319 --> 00:25:15,079
so yeah, so let me talk
about mental models, because my mental model

275
00:25:15,160 --> 00:25:19,039
has been evolving a lot over time, and I think I can clarify for

276
00:25:19,160 --> 00:25:26,599
the listeners a lot of things that
you hear about what observables are, because

277
00:25:26,799 --> 00:25:32,720
that's even kind of, you know, confusing. So observables have been described

278
00:25:32,839 --> 00:25:37,599
any number of ways. They've been
described as lazy. They've been called just

279
00:25:37,839 --> 00:25:44,920
functions and observables just a function,
which is the hardest explanation I have to

280
00:25:45,160 --> 00:25:51,039
ask. They've been described as streams
of values, or they've been described as

281
00:25:51,240 --> 00:25:56,599
promises with more than one value,
so a lot of those are confused.

282
00:25:56,599 --> 00:26:02,880
Oh. They've also been described as
push collections. They've been described as is

283
00:26:02,920 --> 00:26:07,920
it unicast or multicast? Well,
it's unicast, But how do I tell?

284
00:26:08,400 --> 00:26:12,039
It's very hard to piece together,
like what the heck is an observable

285
00:26:12,519 --> 00:26:15,640
with all of these explanations. So
I have what I think is going to

286
00:26:15,680 --> 00:26:23,319
be the final explanation of observable that
people will need to hear. And here's

287
00:26:23,400 --> 00:26:30,599
this. Observables are a template for
a running process. They are like the

288
00:26:30,759 --> 00:26:37,359
string ls dash l. Okay,
so they're like the string ls dash l

289
00:26:37,519 --> 00:26:42,000
because the string ls dash l is
not executing. It's just a template from

290
00:26:42,039 --> 00:26:47,039
which you can create a process that
lists the files in a directory. Right,

291
00:26:48,279 --> 00:26:56,359
So observables aren't really lazy anymore than
a template is lazy because when you

292
00:26:56,559 --> 00:27:00,640
click on the template to create a
new document, it creates new document.

293
00:27:00,759 --> 00:27:03,599
When you have a string, a
command string to run a process, it

294
00:27:03,680 --> 00:27:07,440
runs a new process. So yes, you can call them lazy because they

295
00:27:07,480 --> 00:27:11,519
don't give you values until you subscribe. But that's exactly like the way that

296
00:27:11,599 --> 00:27:18,480
a Unix command line string doesn't give
you lines of output until you execute it

297
00:27:18,519 --> 00:27:23,680
and hit enter. So you will
get what can a Unix process do?

298
00:27:25,279 --> 00:27:29,119
And this is what's so strong about
observables. They can do everything that a

299
00:27:29,240 --> 00:27:33,480
Unix process can do. They can
have an exit code of true or false.

300
00:27:33,519 --> 00:27:37,599
I mean basically, they can complete
or error like an observable, and

301
00:27:37,720 --> 00:27:44,559
they can produce one or more values. They can also produce zero values,

302
00:27:44,640 --> 00:27:48,599
which is why the description of an
observable as a stream of values it misses

303
00:27:48,720 --> 00:27:56,359
the mark. An observable is a
template for a running process. A running

304
00:27:56,400 --> 00:28:02,200
process, which is a subscription,
consumes some resources. So the main thing

305
00:28:02,240 --> 00:28:07,680
about an observable is that it explains
how to consume and release some resources,

306
00:28:07,400 --> 00:28:11,640
just like a command line string tells
you how to consume some resources, and

307
00:28:11,720 --> 00:28:15,640
then it has a standard way of
canceling it. So it's perfectly valid to

308
00:28:15,799 --> 00:28:22,240
have a Unix command line like r
M r F node modules, which doesn't

309
00:28:22,279 --> 00:28:26,319
produce a bunch of values, and
it's perfectly valid to have an observable that

310
00:28:26,480 --> 00:28:33,680
isn't about values, it's about getting
some work done. That's a that's an

311
00:28:33,720 --> 00:28:38,200
interesting way of looking at it.
Actually, I've never thought of that sort

312
00:28:38,200 --> 00:28:42,440
of comparison. And it makes sense
especially that we have like the well,

313
00:28:44,200 --> 00:28:48,799
like the pipe operator rather pipe commands, pipe results throw and yeah, yes,

314
00:28:48,920 --> 00:28:52,720
yeah, we sort of have the
same thing. We can take observable.

315
00:28:53,240 --> 00:28:56,920
Yeah, yeah, yeah, that's
really interesting way looking at it.

316
00:28:57,759 --> 00:29:02,119
Yeah, it's it's just so oh, it's just such a perfect match.

317
00:29:02,440 --> 00:29:07,519
It's a template, it's a command
line string. That's like a perfect match

318
00:29:07,599 --> 00:29:12,680
for me. And so what I've
found is that the best use of an

319
00:29:12,720 --> 00:29:18,319
observable, which is of course a
description of some work that can be done,

320
00:29:18,480 --> 00:29:21,519
a template for doing work, the
best use of an observable, and

321
00:29:21,680 --> 00:29:26,400
pretty much the only thing you need
to do in RX effects is use an

322
00:29:26,440 --> 00:29:32,119
observable as a return value. So
that's kind of talking about old observables,

323
00:29:33,519 --> 00:29:37,079
but it could also be a hot
I don't really find there's much distinction between

324
00:29:37,319 --> 00:29:42,000
hot and cold. There's still a
allocation of a resource that you can release

325
00:29:42,559 --> 00:29:48,440
either way, and they may produce
values or they may not. But so

326
00:29:48,920 --> 00:29:52,000
observable is a great return value.
And in our X effects, when you

327
00:29:52,079 --> 00:29:56,960
return an observable from a function into
an effect or a bus listener or a

328
00:29:56,079 --> 00:30:02,240
service, you don't have to call
dot subscribe on it, right And it

329
00:30:02,400 --> 00:30:06,519
works because if you're ringing a bell
and you have an observable for ringing a

330
00:30:06,599 --> 00:30:11,599
bell, when the bell is wrong, you return the observable for ringing the

331
00:30:11,680 --> 00:30:15,240
bell. Well, RX effects knows
that if you return an observable, well,

332
00:30:15,279 --> 00:30:21,279
of course I have to subscribe to
it if the concurrency model says subscribe

333
00:30:21,359 --> 00:30:26,200
right now, because there are concurrency
models that don't say subscribe right away,

334
00:30:26,440 --> 00:30:33,480
for example a blocking concurrency model also
known as exhaust map. So observables make

335
00:30:33,599 --> 00:30:37,799
a lot of sense as a return
value. And I've written very large and

336
00:30:38,039 --> 00:30:45,519
very async applications with RX effects using
observables, and I never call dot subscribe,

337
00:30:47,160 --> 00:30:51,920
just return an observable. So,
for example, my flagship app for

338
00:30:52,119 --> 00:30:59,319
personal use that I can share around
is called Inbox Radio, and it lets

339
00:30:59,400 --> 00:31:04,920
me dream music that has been sent
to me in my Gmail inbox. And

340
00:31:06,079 --> 00:31:10,079
so there's a lot of async going
on there. You have to get messages

341
00:31:10,160 --> 00:31:12,960
that match a pattern, then you
have to get the attachments, and you

342
00:31:14,039 --> 00:31:18,279
don't want to download them in parallel. You want to download them serially because

343
00:31:18,279 --> 00:31:22,279
you're going to play them serially,
and then you have to decode the stuff

344
00:31:22,359 --> 00:31:26,519
then you have to play it.
And so uh, these these chains of

345
00:31:26,599 --> 00:31:30,480
things are not explicitly chained. The
bus, the bus, the event bus

346
00:31:30,000 --> 00:31:34,559
is sitting there, you know,
making one of them subscribe to another.

347
00:31:36,400 --> 00:31:42,079
And basically this whole thing doesn't have
a can haat map explicitly written in it.

348
00:31:44,400 --> 00:31:51,799
It has create queueing service, and
it doesn't have dot subscribe because you

349
00:31:52,200 --> 00:31:56,440
return an observable and RXFFX call subscribe
on it. So that kind of takes

350
00:31:56,519 --> 00:32:00,119
care of where do you put your
subscription objects. Well, you don't generally

351
00:32:00,359 --> 00:32:07,000
need to see the subscription objects in
this. The exception to that would be

352
00:32:07,559 --> 00:32:12,720
if you had an observable of button
clicks, for example, and you needed

353
00:32:12,799 --> 00:32:19,519
to like call an effect on every
button click from that observable, then you

354
00:32:19,559 --> 00:32:24,920
would subscribe to that outer observable and
say, okay, each time a notification

355
00:32:25,039 --> 00:32:29,920
on the observable comes in, then
call this effect. So that's where you

356
00:32:30,000 --> 00:32:34,160
would if you had like a native
r XJS observable, you could totally call

357
00:32:34,279 --> 00:32:37,519
dot subscribe on it and do whatever
you want. But if you were returning

358
00:32:37,599 --> 00:32:43,640
it as the return value from an
effect or a bus listener, you wouldn't

359
00:32:43,680 --> 00:32:51,640
need to tag dot subscribe on the
end of it. That's fascinating Actually,

360
00:32:52,440 --> 00:32:58,200
as you mentioned exhaust map and stuff, so it's nice to hear that,

361
00:32:59,400 --> 00:33:02,960
uh, those sources of things are
taking care of about because for the life

362
00:33:04,079 --> 00:33:07,440
of me, I couldn't explain the
difference between exhaust map and concat map.

363
00:33:07,519 --> 00:33:10,319
I've looked it out like a bunch
of times. I can easily explain difference

364
00:33:10,359 --> 00:33:15,599
between Merge map and swishmap. Okay, so here's here's yeah, so here's

365
00:33:15,599 --> 00:33:20,480
a here's a gift. This is
for everybody. It's a free uh way

366
00:33:20,640 --> 00:33:22,640
to keep all these things straight?
Can you? Can you scroll down?

367
00:33:23,039 --> 00:33:29,720
Uh in the RX effects repo yep, until you see effects one. Yeah.

368
00:33:29,759 --> 00:33:32,440
I wasn't a service one because I
think either one of them. So

369
00:33:32,559 --> 00:33:38,400
do you see some cards that you
have pictures on them? Oh? Jez.

370
00:33:38,559 --> 00:33:43,400
By the way, if you're comfortable
with that, we could even share

371
00:33:43,440 --> 00:33:46,079
your screens. Some people can be
watching from YouTube, so they could be

372
00:33:46,160 --> 00:33:51,759
seeing the I would. I would
happily do that. Sure, let's do

373
00:33:51,920 --> 00:33:58,000
that. Okay, I think you're
seeing GitHub repo. Yeah, okay,

374
00:33:58,079 --> 00:34:02,559
So this is the RX effects main
repo. And if you scroll down,

375
00:34:04,039 --> 00:34:07,159
there's some code examples, and then
there's a list of the libraries. Yeah,

376
00:34:08,000 --> 00:34:13,039
the one. There's the fascinating set
of cards. Yes, and so

377
00:34:13,239 --> 00:34:17,039
here here is the Here is the
set of cards that you can use.

378
00:34:17,719 --> 00:34:23,559
I have not printed them myself yet
on like true quality card stock, but

379
00:34:23,679 --> 00:34:27,440
if people are interested in that,
I would I would do that. I'd

380
00:34:27,480 --> 00:34:30,679
love to have these at my desk. Well, when we collaborated with desks

381
00:34:30,800 --> 00:34:37,239
next to desks and other people.
But yeah, so this gives friendly names

382
00:34:37,760 --> 00:34:40,639
to each of the each of the
modes, it has pictures, and then

383
00:34:40,920 --> 00:34:47,119
in the little in this window it
says also known as merge map, also

384
00:34:47,239 --> 00:34:52,079
known as cat map. So you
know, my bias is to kind of

385
00:34:52,480 --> 00:34:59,280
tuck rx JS into something as a
bunch of implementation details. I'm not trying

386
00:34:59,320 --> 00:35:05,599
to teach people how to, you
know, necessarily use our XJS better.

387
00:35:06,119 --> 00:35:13,679
If they can get the first ninety
percent of use cases under friendlier names and

388
00:35:14,039 --> 00:35:19,320
in a friendlier library, then that's
kind of what I'm advocating for. I've

389
00:35:19,360 --> 00:35:24,480
gotten several teams that I'm on to
adopt this early in the development life cycle,

390
00:35:25,000 --> 00:35:30,960
and then when people can use one
of these, they use that,

391
00:35:30,280 --> 00:35:35,880
and then it comes up against something
that doesn't fit into that paradigm. Well

392
00:35:35,920 --> 00:35:38,000
then you know, hey, this
this lets you use any amount of r

393
00:35:38,119 --> 00:35:42,639
XJS on top of it. But
yeah, I would say that this is

394
00:35:44,159 --> 00:35:50,280
mnemonic and friendly for people to remember
the modes and just have good pictures of

395
00:35:50,360 --> 00:35:53,440
it, because these modes. This
is what's amazing about what they came up

396
00:35:53,519 --> 00:35:57,480
with our x When they came up
with our XJS and I'm going to go

397
00:35:57,639 --> 00:36:05,679
rewind a little bit in history up
sharing though. So in two thousand and

398
00:36:05,760 --> 00:36:12,159
four, Gmail came out and ajax
started to get used, like in seriousness.

399
00:36:13,079 --> 00:36:16,480
And as AJAX was getting used between
two thousand and four and twenty eleven,

400
00:36:16,920 --> 00:36:23,039
call back help was like really forming. And you know when you attach

401
00:36:23,079 --> 00:36:30,360
an event listener to something, if
that event listener starts some ASYNC process and

402
00:36:30,440 --> 00:36:32,760
then that event comes in again,
you know, you don't have concurrency control.

403
00:36:34,159 --> 00:36:39,280
So seven years after like ajax appeared, Microsoft Labs our research and development

404
00:36:39,840 --> 00:36:43,599
went down and said we got to
solve this ACYNC problem and we got to

405
00:36:43,639 --> 00:36:47,679
solve it for good and hit all
of the use cases. And this is

406
00:36:47,719 --> 00:36:53,880
four years before promises, and they
came up with the Reactive x you know

407
00:36:54,000 --> 00:36:59,039
project, which you know became our
XJS and all the implementations in all the

408
00:36:59,079 --> 00:37:04,800
languages. So they had you know, PhD computer science people and everything really

409
00:37:04,840 --> 00:37:07,079
looking at this async problem and saying
like, what are all the tools we

410
00:37:07,159 --> 00:37:13,199
need to solve every use case in
async? And they built it. But

411
00:37:13,920 --> 00:37:19,039
by two fift by twenty twelve,
the A plus team was working on promises

412
00:37:19,199 --> 00:37:23,559
and promises were gaining traction. I
think partly they were beating winning the race

413
00:37:23,639 --> 00:37:31,400
because the documentation for our XJS was
just really problematic. They you know,

414
00:37:31,679 --> 00:37:42,719
like the documentation for gosh, for
merge map, it's it's obtuse. It

415
00:37:43,239 --> 00:37:49,719
projects inner observables into the output observable, and it's just it's just not descriptive

416
00:37:49,840 --> 00:37:57,119
enough. So promises from twenty eleven
to twenty fifteen were gaining mind share and

417
00:37:57,280 --> 00:38:00,039
they were an improvement over just regular
function, but they didn't get all the

418
00:38:00,079 --> 00:38:08,000
way to RxJS. And then promises
were adopted. But promises can't control concurrency

419
00:38:08,400 --> 00:38:14,360
in all the ways that ox js
can. And so those concurrency operators that

420
00:38:14,480 --> 00:38:17,400
are so hard to remember but described
in those cards that I showed, those

421
00:38:17,480 --> 00:38:24,440
things are amazing because they solved for
all async combinations and I can I can

422
00:38:24,480 --> 00:38:30,000
describe this in real life too.
It isn't just RxJS. They didn't just

423
00:38:30,079 --> 00:38:37,800
solve like for web development. It's
like extrapolatable. It can be extrapolated to

424
00:38:37,920 --> 00:38:40,960
real life. So I gave the
analogy on the React show. Suppose I

425
00:38:42,039 --> 00:38:45,960
am making a sandwich, or my
daughter she wants a grilled cheese sandwich.

426
00:38:46,000 --> 00:38:49,960
I'm on the stove. I'm busy. I've been requested to make a sandwich.

427
00:38:49,960 --> 00:38:53,039
I'm busy making the sandwich, and
she says, Dad, I want

428
00:38:53,119 --> 00:39:00,320
chicken nuggets instead. Well, these
five concurrency modes well for them, or

429
00:39:00,360 --> 00:39:04,679
in r x JAS, I added
the fifth one. These five concurrency modes

430
00:39:04,800 --> 00:39:09,559
describe what I can respond with.
Right, I can merge MAP, So,

431
00:39:09,679 --> 00:39:14,360
in other words, I can just
start a new pan cooking the chicken

432
00:39:14,440 --> 00:39:19,840
nuggets next to the grilled cheese.
I can say, okay, Sierra,

433
00:39:20,119 --> 00:39:22,639
but only after I make the grilled
cheese. I'll get started on the chicken

434
00:39:22,679 --> 00:39:27,840
nuggets. That's cancat MAP. I
can say, oh, you want chicken

435
00:39:27,920 --> 00:39:30,599
nuggets, Well, I better stop
making the grilled cheese. I'll make you

436
00:39:30,719 --> 00:39:37,840
chicken nuggets instead. And I can
also say no, Sierra, I'm already

437
00:39:37,880 --> 00:39:40,960
making your grilled cheese. I'm not
going to start chicken nuggets. So that

438
00:39:42,320 --> 00:39:47,039
happens to be exhaust MAP. Finally, the final one, which I just

439
00:39:47,199 --> 00:39:52,199
came up with by looking at what
are all the possibilities. The final one

440
00:39:52,320 --> 00:39:54,760
is I'm making the grilled cheese.
Sierra says, can I have chicken nuggets?

441
00:39:55,239 --> 00:39:59,119
I just turn off the stove for
the grilled cheese, and I say,

442
00:40:00,000 --> 00:40:01,679
I can't deal with all these requests. Just make your own lunch,

443
00:40:02,039 --> 00:40:07,000
so I can walk away from that. These are universal, right, and

444
00:40:07,519 --> 00:40:15,480
so it's really cool that RxJS has
all of the universal possibilities embedded in it.

445
00:40:15,880 --> 00:40:20,880
It's not cool that everyone isn't using
it. And I think the reason

446
00:40:21,000 --> 00:40:28,639
is because the documentation isn't friendly enough. And so instead of trying to improve

447
00:40:28,719 --> 00:40:36,679
the documentation and doing you know that
kind of long but noble process of trying

448
00:40:36,760 --> 00:40:39,880
to contribute back to an open source
repository, you use. But I just

449
00:40:39,960 --> 00:40:44,360
think, well, it's time for
a higher level of abstraction. And I

450
00:40:44,360 --> 00:40:47,320
don't think I'm on the wrong track
because, like I ask for comparisons,

451
00:40:47,360 --> 00:40:52,360
I say, how would you do
this the RXGS way? And it's fifteen

452
00:40:52,400 --> 00:40:57,920
to twenty confusing lines with you know, seven levels of nesting versus you know,

453
00:40:59,000 --> 00:41:01,679
one or two levels nesting and like
five lines. So I want to

454
00:41:01,719 --> 00:41:07,880
stick with this approach of creating a
rapper library and hopefully you know, hey,

455
00:41:07,960 --> 00:41:10,880
if any of this ends up back
in r x j S, if

456
00:41:10,920 --> 00:41:15,320
it ends up in react, you
know, I don't care, Like I'm

457
00:41:15,360 --> 00:41:19,679
not I'm not saying everybody has to
use this exactly this way, but I

458
00:41:19,760 --> 00:41:24,000
am saying I think there is an
abstraction just waiting to be uh, you

459
00:41:24,079 --> 00:41:30,280
know, birthed into the community.
This truly has been an evening of interesting

460
00:41:30,360 --> 00:41:38,480
analogies. Thanks for thanks for explaining
me the difference between I find that I

461
00:41:38,559 --> 00:41:46,199
found it all Libray really fascinating and
be surprised I haven't heard about it before.

462
00:41:46,719 --> 00:41:49,880
I will. I will research it, you know, if it's okay,

463
00:41:49,920 --> 00:41:52,719
if I PINU you with questions from
this time. Yeah, you know,

464
00:41:52,840 --> 00:41:55,719
the best place to engage with me
right now is uh is through the

465
00:41:55,760 --> 00:42:04,559
GitHub repo. Stars are welcome discussions
and issues also, and uh you know,

466
00:42:04,760 --> 00:42:07,679
that's that's where we can talk about
the repo. If we want to

467
00:42:07,719 --> 00:42:14,840
talk a little more generally about stuff, I'm on Twitter at slash x at

468
00:42:15,239 --> 00:42:20,360
Dean dev Dad and that'll go in
the show notes. And yeah, I

469
00:42:20,400 --> 00:42:23,079
mean I would love to to engage
on this more. Like I said,

470
00:42:23,079 --> 00:42:30,119
I have my workplace where I've gotten
now three teams you know, using this

471
00:42:30,480 --> 00:42:35,880
as you know, a starting point, and so that's probably where you know,

472
00:42:36,360 --> 00:42:39,199
more of my time gets spent in
the workplace than marketing it. But

473
00:42:39,519 --> 00:42:46,000
since I've reconnected with this awesome top
end dev's team and and all the shows

474
00:42:46,039 --> 00:42:49,480
that they run. I was like, well, sure, I'd love to

475
00:42:49,880 --> 00:42:58,480
talk about it more widely. That's
awesome. Yeah, and for anyone who's

476
00:42:58,559 --> 00:43:02,480
listening to this and once to try
out our ax effects and other frameworks,

477
00:43:02,960 --> 00:43:07,159
we do have an entire episode about
how this can be used and React,

478
00:43:07,639 --> 00:43:12,480
so if you're interested, you can
check out the latest episode we did on

479
00:43:12,679 --> 00:43:15,840
React Round Up, where we also
talk to Dean about how we can use

480
00:43:15,960 --> 00:43:22,800
our ex effects to simplify some of
the issues that React developers generally run into.

481
00:43:22,679 --> 00:43:30,840
So yeah, this again, this
has been great again because the React

482
00:43:30,920 --> 00:43:36,920
episode was also awesome. I really
love the the analogis to your daughter,

483
00:43:37,360 --> 00:43:45,119
and it just it makes it so
much easier to remember what exhaust map means

484
00:43:45,239 --> 00:43:57,559
because now I can just remember being
exhausted, like I'm so thanks, thanks

485
00:43:57,599 --> 00:44:01,440
again, man. I hope you
come back even even more times whenever possible.

486
00:44:04,480 --> 00:44:07,840
So let's do a quick round of
promos before wrapping things up. So

487
00:44:08,480 --> 00:44:14,599
you're mentioning your Twitter, the GitHub
repository for the project. Is there anything

488
00:44:14,679 --> 00:44:19,039
else you would like to promote?
Just that? Just that? Okay,

489
00:44:19,360 --> 00:44:22,559
okay, awesome. So yeah,
just reiterating anyone who's listening to this,

490
00:44:23,159 --> 00:44:28,280
if you can't stop what you're doing
for just ten seconds, then go into

491
00:44:28,360 --> 00:44:34,320
the GitHub repository and give it a
star that could create a chain reaction that

492
00:44:34,559 --> 00:44:38,840
is going to lead to eventually us
having better names to our rx jazz operator.

493
00:44:39,000 --> 00:44:45,400
So please do that for the entire
community and future generations. Well,

494
00:44:45,519 --> 00:44:51,800
I should mention there is a thread
a discussion in the RxJS repo that opened

495
00:44:51,840 --> 00:44:59,519
up recently where they're seeking to do
some renaming in RxJS eight. So you

496
00:44:59,599 --> 00:45:05,320
can find that Ben Lesh's profile on
Twitter, and so if you have opinions

497
00:45:05,320 --> 00:45:07,880
about it, like I do,
you can you can contribute in their discussion

498
00:45:07,960 --> 00:45:13,519
directly. I'm sure they'd appreciate the
community and put awesome Rman. I'm gonna

499
00:45:13,960 --> 00:45:15,599
give this to you in a second. I know that you have a special

500
00:45:15,639 --> 00:45:19,719
announcement, so I'm going to leave
you to the end. Mine is just

501
00:45:19,800 --> 00:45:28,760
going to be the regular episode interest. So if you're interested in outsourcing your

502
00:45:28,880 --> 00:45:34,119
software or design teams, or even
better, extending your design and software development

503
00:45:34,199 --> 00:45:37,800
teams, you should definitely check out
Onvoid dot com is U n v o

504
00:45:37,920 --> 00:45:43,719
I D dot com and yeah,
that's basically gonna be my promo. So

505
00:45:44,320 --> 00:45:49,679
arman, please take away. I
know you have a huge announcement. Well

506
00:45:49,760 --> 00:45:52,519
it's not that huge. The huge
announcement like a month ago, as I

507
00:45:52,639 --> 00:45:58,360
mentioned on the previous episodes and also
on Twitter and LinkedIn and all the other

508
00:45:58,440 --> 00:46:00,840
places I visit. I don't know. I wrote a book on Angular.

509
00:46:01,840 --> 00:46:07,559
It's called Modern Angular. It's with
the many publications. It's in early access

510
00:46:07,760 --> 00:46:15,559
now. So out of the ten
total chapters, we have now five out.

511
00:46:15,440 --> 00:46:21,760
I think two other chapters will drop
like in a week or two,

512
00:46:22,079 --> 00:46:27,199
I guess. But the entire manuscript
is finished, so no worries if you

513
00:46:27,239 --> 00:46:29,800
think I'm not going to finish it. I finished it. I'm just doing

514
00:46:29,960 --> 00:46:35,760
some polishing and listening to early access
leaders comments. And by the way,

515
00:46:35,880 --> 00:46:38,480
the fifth chapter the last month,
that is right now available is about our

516
00:46:38,519 --> 00:46:45,719
issues. So yeah, if this
episode got you interested, maybe you can

517
00:46:45,760 --> 00:46:50,920
also take a look at that chapter. The book discusses all the new features

518
00:46:51,039 --> 00:46:54,480
that we have. By the way, the sixth and seventh chapter that we

519
00:46:54,719 --> 00:47:00,480
drop soon are all about signals,
which is the idea hottest topic right now.

520
00:47:01,519 --> 00:47:08,559
And for this episode, I actually
got a special promo code from Manning

521
00:47:08,719 --> 00:47:15,519
Publications, so you can use the
promo code pod Angler twenty four. Let's

522
00:47:15,559 --> 00:47:22,800
also put that in the description to
get forty five percent of any Manning product.

523
00:47:22,719 --> 00:47:29,000
I hope you spent it on my
book, but yeah so, and

524
00:47:29,119 --> 00:47:35,079
also yeah, thanks to many Publications
for giving me that promo code specifically for

525
00:47:35,320 --> 00:47:40,320
our episodes. So if anyone of
the listeners is interesting, take a look

526
00:47:40,320 --> 00:47:45,760
at the description. I will.
Let's also put the link to the book

527
00:47:45,840 --> 00:47:50,960
there. So yeah, that's it. That's my promotion. Gonna be the

528
00:47:51,000 --> 00:47:55,079
same for a while. Yeah,
Aaran, can you send it on the

529
00:47:55,280 --> 00:48:00,159
internal chat so that I can put
it in the comments section for anyone in

530
00:48:00,239 --> 00:48:05,239
the livestream. Yeah, forty five
percent discount? Is that what you said?

531
00:48:06,119 --> 00:48:12,239
Yep, ye, that's a huge, huge discount, so awesome,

532
00:48:12,480 --> 00:48:16,000
awesome, thanks Man. And I
think the fact that you have two chapters

533
00:48:16,079 --> 00:48:25,840
about signals in angular is really interesting
because it's uncharted territory, right like in

534
00:48:25,960 --> 00:48:30,440
terms of conventions and things like that. So I think this is the kind

535
00:48:30,480 --> 00:48:36,559
of thing that is relevant even for
those that are already experienced, like you

536
00:48:36,639 --> 00:48:39,480
might be thinking, I don't need
Arman's book, like I'm already experienced in

537
00:48:39,519 --> 00:48:44,679
Angler, there's no need for that. And even Signals. Yeah, like

538
00:48:44,719 --> 00:48:47,679
I'm comfortable with Signals. I know
that they were released with whatever, but

539
00:48:50,559 --> 00:48:53,800
I'm pretty sure there's something that you
can learn from those two chapters specific to

540
00:48:53,920 --> 00:49:00,199
Signals. So I would still highly
recommend buying Arman's book, even if you

541
00:49:00,239 --> 00:49:05,239
feel extremely comfortable with Angler already.
So yeah, coupon is in the show

542
00:49:05,280 --> 00:49:09,280
notes. Again, it's pod pod
Angular twenty four altogether, no spaces,

543
00:49:09,360 --> 00:49:15,760
no dashes. All right, thanks
thanks Man for having coo cool book.

544
00:49:15,920 --> 00:49:20,880
Just check it out. Thank you. All right, So, guys,

545
00:49:21,000 --> 00:49:24,960
thank you so much. Also putting
the link to Arman's book in the comment

546
00:49:25,039 --> 00:49:29,719
section, so you have the coupon
and the book link. There no reason

547
00:49:29,800 --> 00:49:34,239
to not not buy it. But
yeah, again, guys, thank you

548
00:49:34,360 --> 00:49:37,119
so much. Dean. Thanks for
being on the show, for not just

549
00:49:37,559 --> 00:49:44,199
all the time that you spent in
here, but also the effort to build

550
00:49:44,679 --> 00:49:51,679
this amazing library that is available for
everyone in open source. So that's really

551
00:49:52,199 --> 00:49:55,159
that's really a major effort. Thank
you for that. And yeah, at

552
00:49:55,280 --> 00:50:00,440
least that's it for me. Yeah, thanks everyone. You're in the next

553
00:50:00,519 --> 00:50:02,880
one here in the next year.
