1
00:00:01,440 --> 00:00:05,400
<v Jonas>Welcome back to the last lecture of the section.</v>

2
00:00:05,400 --> 00:00:07,680
And so in this one, we're gonna apply

3
00:00:07,680 --> 00:00:09,230
everything that we learned

4
00:00:09,230 --> 00:00:13,093
in the last few videos to Coding Challenge #3.

5
00:00:14,580 --> 00:00:18,200
And this coding challenge basically has two part.

6
00:00:18,200 --> 00:00:20,390
So in the first part, I want you to write

7
00:00:20,390 --> 00:00:23,560
an async function called loadNPause,

8
00:00:23,560 --> 00:00:26,663
which will basically recreate Coding Challenge #2,

9
00:00:27,560 --> 00:00:30,420
but this time using async/await.

10
00:00:30,420 --> 00:00:33,150
And so of course, that is only about the part

11
00:00:33,150 --> 00:00:36,230
where we actually consume the promise.

12
00:00:36,230 --> 00:00:39,640
Then you can compare the two versions that you have

13
00:00:39,640 --> 00:00:42,070
and think about the big differences

14
00:00:42,070 --> 00:00:44,183
and also see which one you like more.

15
00:00:45,320 --> 00:00:46,900
Now in order to do this,

16
00:00:46,900 --> 00:00:51,423
don't forget to set your network tab to Fast 3G.

17
00:00:52,910 --> 00:00:54,000
Alright?

18
00:00:54,000 --> 00:00:55,660
So that's part number one,

19
00:00:55,660 --> 00:00:58,750
basically converting what we did before,

20
00:00:58,750 --> 00:01:00,860
but then comes part number two,

21
00:01:00,860 --> 00:01:03,360
which is again a more difficult one.

22
00:01:03,360 --> 00:01:06,030
And actually in this one, you will do something

23
00:01:06,030 --> 00:01:07,890
that we didn't do before,

24
00:01:07,890 --> 00:01:10,790
but I'm sure that with the instructions here,

25
00:01:10,790 --> 00:01:12,630
you can make it.

26
00:01:12,630 --> 00:01:14,310
So, what I want you to do

27
00:01:14,310 --> 00:01:17,535
is to create an async function loadAll,

28
00:01:17,535 --> 00:01:21,120
and this one receives an array of image path,

29
00:01:21,120 --> 00:01:22,920
and so that's this one.

30
00:01:22,920 --> 00:01:25,400
So it's an array which contains the path

31
00:01:25,400 --> 00:01:30,380
of all three images in the image folder, okay?

32
00:01:30,380 --> 00:01:34,397
So you receive debt array in the function

33
00:01:34,397 --> 00:01:37,020
and then I want you to use the map method

34
00:01:37,020 --> 00:01:41,400
to loop over the array in order to load all the images

35
00:01:41,400 --> 00:01:44,993
that are here in this array with the createImage function.

36
00:01:46,070 --> 00:01:50,483
So this one here where we promise a fight, loading an image.

37
00:01:51,750 --> 00:01:53,280
Okay?

38
00:01:53,280 --> 00:01:57,020
Of course the map method will then result in a new array

39
00:01:57,020 --> 00:02:00,820
and you should call this one images like this.

40
00:02:00,820 --> 00:02:03,630
Now keep in mind that createImage here

41
00:02:03,630 --> 00:02:05,560
will return a promise.

42
00:02:05,560 --> 00:02:08,490
And so the callback function of the map method

43
00:02:08,490 --> 00:02:10,530
needs to be special.

44
00:02:10,530 --> 00:02:13,020
So you need to consume the promise

45
00:02:13,020 --> 00:02:15,290
that comes from createImage

46
00:02:15,290 --> 00:02:17,810
and so therefore, as I said

47
00:02:17,810 --> 00:02:20,070
the callback function in the map method

48
00:02:20,070 --> 00:02:22,560
should be a special type of function.

49
00:02:22,560 --> 00:02:25,640
So I'm not spoiling which function it is,

50
00:02:25,640 --> 00:02:29,200
but hopefully you can guess what I'm talking about.

51
00:02:29,200 --> 00:02:30,550
Alright?

52
00:02:30,550 --> 00:02:33,670
But anyway, next I want you to check out

53
00:02:33,670 --> 00:02:36,170
this images array in the console

54
00:02:36,170 --> 00:02:38,633
and is it what you expected?

55
00:02:39,560 --> 00:02:41,750
So again, here I want you to think

56
00:02:41,750 --> 00:02:44,350
about the results that you get.

57
00:02:44,350 --> 00:02:46,490
So these images array,

58
00:02:46,490 --> 00:02:49,390
and think if you expected it to be like this,

59
00:02:49,390 --> 00:02:51,103
and also if it makes sense,

60
00:02:52,850 --> 00:02:53,683
okay?

61
00:02:53,683 --> 00:02:57,230
And what I just said will make sense once you get there.

62
00:02:57,230 --> 00:02:59,500
Then in the next step, you should use

63
00:02:59,500 --> 00:03:01,740
a promise combinator function

64
00:03:01,740 --> 00:03:05,120
to actually get the images from the array.

65
00:03:05,120 --> 00:03:08,810
So this is a very important hint right there.

66
00:03:08,810 --> 00:03:12,280
Then finally, you should also add the parallel class

67
00:03:12,280 --> 00:03:14,100
to all the images.

68
00:03:14,100 --> 00:03:18,230
And so once again, you should probably loop over the images

69
00:03:18,230 --> 00:03:21,560
and then to each of them add to this class.

70
00:03:21,560 --> 00:03:23,720
So again, this part two here

71
00:03:23,720 --> 00:03:26,130
actually contains some new parts

72
00:03:26,130 --> 00:03:28,610
that you will have to figure out on your own

73
00:03:28,610 --> 00:03:31,200
and experiment a little bit with that.

74
00:03:31,200 --> 00:03:33,190
But at this point of the course,

75
00:03:33,190 --> 00:03:35,920
so already pretty deep into it,

76
00:03:35,920 --> 00:03:39,050
it's probably a good idea that you start experimenting

77
00:03:39,050 --> 00:03:41,140
with some stuff on your own.

78
00:03:41,140 --> 00:03:44,470
And so that's why I created this challenge like this.

79
00:03:44,470 --> 00:03:47,870
So good luck with this take all the time that you need

80
00:03:47,870 --> 00:03:49,973
and then I see you back here.

81
00:03:53,960 --> 00:03:58,590
Welcome back here to my solution now.

82
00:03:58,590 --> 00:04:01,210
So as you see, I already have all the code here

83
00:04:01,210 --> 00:04:02,430
from Challenge #2

84
00:04:03,340 --> 00:04:06,170
and so what we're going to change now is

85
00:04:06,170 --> 00:04:08,190
basically this part here.

86
00:04:08,190 --> 00:04:12,460
So we will recreate this big then chain

87
00:04:12,460 --> 00:04:14,093
using now async/await.

88
00:04:14,970 --> 00:04:17,303
So the function is called loadNPause,

89
00:04:20,600 --> 00:04:24,820
and it is an async function which doesn't have any arguments

90
00:04:26,040 --> 00:04:27,643
or missing to function keywords.

91
00:04:28,600 --> 00:04:30,850
So it doesn't have any arguments

92
00:04:30,850 --> 00:04:32,480
and so as always,

93
00:04:32,480 --> 00:04:35,630
we need to wrap everything into a try block

94
00:04:38,720 --> 00:04:41,220
and in here here, the error.

95
00:04:41,220 --> 00:04:44,070
And actually right now it is already allowed

96
00:04:44,070 --> 00:04:47,240
to use catch without the error.

97
00:04:47,240 --> 00:04:50,950
So that's new in JavaScript previously that wasn't allowed,

98
00:04:50,950 --> 00:04:54,730
but just to make it consistent, I always used to error here,

99
00:04:54,730 --> 00:04:56,963
even if I then don't need it.

100
00:04:57,800 --> 00:05:01,980
But here let's just log it to the console as always.

101
00:05:01,980 --> 00:05:03,200
Alright.

102
00:05:03,200 --> 00:05:05,900
So here is the first promise.

103
00:05:05,900 --> 00:05:07,660
So this one...

104
00:05:07,660 --> 00:05:10,170
So let's put that here

105
00:05:10,170 --> 00:05:12,540
and since we're using async/await,

106
00:05:12,540 --> 00:05:15,080
I will now await that promise

107
00:05:15,080 --> 00:05:18,340
and store the results into image.

108
00:05:18,340 --> 00:05:21,300
So that's basically the variable that we have here

109
00:05:21,300 --> 00:05:24,510
as the barometer in the then method.

110
00:05:24,510 --> 00:05:27,793
And so that's the same name that makes sense here.

111
00:05:28,830 --> 00:05:29,930
So image,

112
00:05:29,930 --> 00:05:34,150
and let's use one here because we're gonna have multiple

113
00:05:34,150 --> 00:05:36,510
or actually that's not even necessary

114
00:05:36,510 --> 00:05:40,093
because this time we won't need the currentImg variable,

115
00:05:41,650 --> 00:05:42,483
okay?

116
00:05:42,483 --> 00:05:45,870
But more about that once we reach that point.

117
00:05:45,870 --> 00:05:50,180
So again, the image is of course, the result of this

118
00:05:50,180 --> 00:05:52,160
successful promise.

119
00:05:52,160 --> 00:05:52,993
Alright?

120
00:05:52,993 --> 00:05:56,390
And so with that, we already translated this year.

121
00:05:56,390 --> 00:06:00,943
Now what we is to simply log this to the console.

122
00:06:03,140 --> 00:06:07,203
And so here we have Load image 1 already.

123
00:06:08,390 --> 00:06:10,933
Then next up we have this wait.

124
00:06:12,520 --> 00:06:17,340
And so here we can just await for wait 2.

125
00:06:18,460 --> 00:06:19,870
And just like before,

126
00:06:19,870 --> 00:06:23,400
since the weight promise does not have any resolved value,

127
00:06:23,400 --> 00:06:27,253
we actually don't need to save anything to any variable.

128
00:06:28,230 --> 00:06:30,350
So here we basically just pass

129
00:06:30,350 --> 00:06:32,910
the execution for two seconds,

130
00:06:32,910 --> 00:06:35,053
and then what we want to do is this,

131
00:06:36,590 --> 00:06:38,380
but not exactly this,

132
00:06:38,380 --> 00:06:40,600
because now instead of current image,

133
00:06:40,600 --> 00:06:43,290
we can use simply image.

134
00:06:43,290 --> 00:06:45,200
And that's because now we are

135
00:06:45,200 --> 00:06:47,620
still here in the same function

136
00:06:47,620 --> 00:06:49,460
or actually in the same block

137
00:06:49,460 --> 00:06:51,510
and so in the same scope

138
00:06:51,510 --> 00:06:56,510
while here we defined the image in one function,

139
00:06:56,520 --> 00:06:59,650
and then we set the style in another function.

140
00:06:59,650 --> 00:07:02,883
And so then we needed to use this global variable.

141
00:07:03,980 --> 00:07:07,430
So like this, it is a lot better of course.

142
00:07:07,430 --> 00:07:10,683
And so now we just need to do the same for image two.

143
00:07:13,210 --> 00:07:17,110
So, again we don't need the external variable.

144
00:07:17,110 --> 00:07:19,133
We can now simply reassign image.

145
00:07:20,060 --> 00:07:23,203
So image 2, then image 2 loaded,

146
00:07:24,300 --> 00:07:27,223
and the rest works simply exactly the same.

147
00:07:29,200 --> 00:07:31,640
Here let's just change to error

148
00:07:31,640 --> 00:07:35,400
and with that, we should already be good to go.

149
00:07:35,400 --> 00:07:37,090
So loadNPause,

150
00:07:37,090 --> 00:07:39,600
and here let me comment this out

151
00:07:39,600 --> 00:07:42,473
so that the same logic doesn't happen twice.

152
00:07:44,230 --> 00:07:46,203
And so this is already part one.

153
00:07:47,440 --> 00:07:51,018
Let's set on network here to Slow,

154
00:07:51,018 --> 00:07:53,683
or actually Fast 3G,

155
00:07:58,030 --> 00:08:01,180
And let's actually inspect the images arriving here.

156
00:08:01,180 --> 00:08:05,170
So I think that this now part here is really helpful.

157
00:08:05,170 --> 00:08:06,863
So seeing everything arrive,

158
00:08:09,700 --> 00:08:12,400
it's just a bit difficult.

159
00:08:12,400 --> 00:08:14,253
But anyway, let's just try it.

160
00:08:15,890 --> 00:08:18,123
And so here you see the image loading.

161
00:08:21,730 --> 00:08:24,740
And so then here was the waiting time of two seconds

162
00:08:24,740 --> 00:08:27,453
and then the next image loaded and finished.

163
00:08:28,520 --> 00:08:32,240
So again, image 1 loaded during all this time,

164
00:08:32,240 --> 00:08:35,700
then we had or two second waiting time right here.

165
00:08:35,700 --> 00:08:39,190
And then during this time, the second image loaded,

166
00:08:39,190 --> 00:08:42,013
and here we can actually get all this detail about that.

167
00:08:44,080 --> 00:08:46,530
So this is really interesting stuff

168
00:08:46,530 --> 00:08:48,683
if you want to dig deep into this.

169
00:08:49,730 --> 00:08:50,563
Alright?

170
00:08:50,563 --> 00:08:52,663
But anyway, that's part one.

171
00:08:53,500 --> 00:08:56,370
And so now let's go to part two

172
00:08:56,370 --> 00:08:59,787
to create this async function called loadAll

173
00:09:00,630 --> 00:09:02,750
which receives image array.

174
00:09:02,750 --> 00:09:07,500
And then we loop over the array and create an array images.

175
00:09:07,500 --> 00:09:09,893
So just keeping these names in mind.

176
00:09:13,960 --> 00:09:16,303
So part two will be,

177
00:09:18,100 --> 00:09:22,610
loadAll is an async function

178
00:09:22,610 --> 00:09:24,483
which takes an imgArr.

179
00:09:29,370 --> 00:09:32,683
Then is always this block.

180
00:09:33,780 --> 00:09:34,953
So try catch.

181
00:09:36,290 --> 00:09:40,690
And now here, we have to create that images array,

182
00:09:40,690 --> 00:09:45,690
which is the result of imgArr.map.

183
00:09:47,160 --> 00:09:50,920
But now we need to think about the callback function here,

184
00:09:50,920 --> 00:09:52,480
right?

185
00:09:52,480 --> 00:09:55,990
So in each iteration of the array, we have one image

186
00:09:57,110 --> 00:10:00,150
and we want to use the createImage function

187
00:10:02,033 --> 00:10:04,650
to load that image.

188
00:10:04,650 --> 00:10:08,810
Now this function here returns a promise,

189
00:10:08,810 --> 00:10:09,770
right?

190
00:10:09,770 --> 00:10:13,090
And so we should await that promise.

191
00:10:13,090 --> 00:10:15,573
Otherwise nothing is going to happen.

192
00:10:16,620 --> 00:10:20,280
And so here we need to make this function an async function

193
00:10:21,320 --> 00:10:24,643
so that then in there we can use, await.

194
00:10:25,740 --> 00:10:26,573
Alright?

195
00:10:28,500 --> 00:10:32,563
So let's actually pause this one here, just as instructed,

196
00:10:35,270 --> 00:10:40,060
and instead we will call loadAll with

197
00:10:40,060 --> 00:10:41,513
this test array.

198
00:10:44,070 --> 00:10:44,963
Alright.

199
00:10:47,050 --> 00:10:48,980
And then the instruction was also

200
00:10:48,980 --> 00:10:51,103
to check out these images array.

201
00:10:54,320 --> 00:10:55,663
So, images.

202
00:10:57,840 --> 00:10:59,498
Now, okay?

203
00:10:59,498 --> 00:11:02,183
And so now let's take a look at the console.

204
00:11:03,310 --> 00:11:05,823
Let's make it a bit bigger again here.

205
00:11:07,210 --> 00:11:12,210
And so what we got here are actually three promises.

206
00:11:13,000 --> 00:11:15,210
So we have an array of promises

207
00:11:15,210 --> 00:11:18,220
and not the images themselves.

208
00:11:18,220 --> 00:11:21,340
And this is actually a big source of confusion

209
00:11:21,340 --> 00:11:24,240
for most async/await beginners.

210
00:11:24,240 --> 00:11:26,420
And I actually remember really well

211
00:11:26,420 --> 00:11:29,040
when I first stumbled upon this problem

212
00:11:29,040 --> 00:11:32,630
and didn't really understand why this was happening.

213
00:11:32,630 --> 00:11:34,680
However, with all the knowledge

214
00:11:34,680 --> 00:11:37,000
that you just learned in the section,

215
00:11:37,000 --> 00:11:39,070
if we really think about is

216
00:11:39,070 --> 00:11:41,113
then it might actually make sense.

217
00:11:42,400 --> 00:11:46,370
So, here we have an async function, right?

218
00:11:46,370 --> 00:11:48,710
And this is an arrow function.

219
00:11:48,710 --> 00:11:51,290
So we have an implicit return.

220
00:11:51,290 --> 00:11:54,250
So this is like returning something

221
00:11:54,250 --> 00:11:58,240
from this callback function in each iteration, right?

222
00:11:58,240 --> 00:12:00,060
However, as we already know,

223
00:12:00,060 --> 00:12:03,580
an async function will always return a promise

224
00:12:03,580 --> 00:12:07,990
and not really the value that we're interested in, right?

225
00:12:07,990 --> 00:12:10,780
Instead, the value that we want to return

226
00:12:10,780 --> 00:12:14,140
is going to be the fulfilled value of the promise

227
00:12:14,140 --> 00:12:16,330
that the async function returns.

228
00:12:16,330 --> 00:12:17,690
Remember that?

229
00:12:17,690 --> 00:12:20,770
And so that is exactly what is happening here,

230
00:12:20,770 --> 00:12:23,423
but it is happening simply three times.

231
00:12:24,310 --> 00:12:26,680
So we are returning something three times

232
00:12:26,680 --> 00:12:28,840
from an async function here,

233
00:12:28,840 --> 00:12:33,840
and so therefore the result will be three promises, okay?

234
00:12:33,860 --> 00:12:36,220
So just like it happened in that lecture

235
00:12:36,220 --> 00:12:39,140
where we attempted to return a string

236
00:12:39,140 --> 00:12:42,870
from one of the functions, remember that?

237
00:12:42,870 --> 00:12:46,323
So here it is indeed the exact same situation.

238
00:12:47,220 --> 00:12:50,973
So again, we end up with this array of promises,

239
00:12:51,950 --> 00:12:52,910
okay?

240
00:12:52,910 --> 00:12:54,810
But of course behind the scenes,

241
00:12:54,810 --> 00:12:57,020
the images are already being loaded,

242
00:12:57,020 --> 00:12:59,140
and so we're basically fine.

243
00:12:59,140 --> 00:13:01,640
So all we need to do now is to get

244
00:13:01,640 --> 00:13:05,293
these image elements themselves out of the promise.

245
00:13:06,410 --> 00:13:08,870
So how can we do that?

246
00:13:08,870 --> 00:13:11,740
Well, we could take each promise out of the array

247
00:13:11,740 --> 00:13:14,140
and then manually await it,

248
00:13:14,140 --> 00:13:16,570
but that wouldn't make much sense.

249
00:13:16,570 --> 00:13:19,280
First because we would have additional work

250
00:13:19,280 --> 00:13:21,910
and second, because then that work

251
00:13:21,910 --> 00:13:25,860
would not be happening in parallel, right?

252
00:13:25,860 --> 00:13:28,810
But we want it to be happening in parallel

253
00:13:28,810 --> 00:13:31,873
and therefore we can use Promise.all.

254
00:13:33,300 --> 00:13:36,440
So Promise.all is perfect for this

255
00:13:36,440 --> 00:13:39,870
because it already expects an array of images.

256
00:13:39,870 --> 00:13:43,910
And so this images array is already perfect

257
00:13:43,910 --> 00:13:46,823
to handle by dysfunction,

258
00:13:47,740 --> 00:13:48,573
right?

259
00:13:49,540 --> 00:13:51,420
And so now we simply need to

260
00:13:53,240 --> 00:13:55,090
store the image elements here.

261
00:13:55,090 --> 00:13:58,553
So let's call it that into this array.

262
00:14:00,300 --> 00:14:02,943
So let's then take a look at that.

263
00:14:07,450 --> 00:14:11,560
And so now this is of course going to take some time.

264
00:14:11,560 --> 00:14:16,290
So this can only happen once the images are actually loaded.

265
00:14:16,290 --> 00:14:18,573
And so now indeed, here we go.

266
00:14:20,950 --> 00:14:22,410
Alright?

267
00:14:22,410 --> 00:14:26,460
So here are the three image elements and they're now hidden

268
00:14:26,460 --> 00:14:29,753
and so that's why we need to add the parallel class later.

269
00:14:31,150 --> 00:14:35,290
So, again this worked because here in this loop,

270
00:14:35,290 --> 00:14:38,100
of course, the await keyword did its job

271
00:14:38,100 --> 00:14:41,640
of pausing the execution of the function, right?

272
00:14:41,640 --> 00:14:44,130
And so therefore only after that,

273
00:14:44,130 --> 00:14:47,260
we did then Promise.all to actually get

274
00:14:47,260 --> 00:14:51,270
the image elements out of the promises array.

275
00:14:51,270 --> 00:14:53,600
So this was a bit tricky

276
00:14:53,600 --> 00:14:55,690
but maybe you did figure out that

277
00:14:55,690 --> 00:14:57,723
this is how you solve this problem.

278
00:14:58,560 --> 00:15:01,130
So once you need to use async await

279
00:15:01,130 --> 00:15:03,990
in a map method like this,

280
00:15:03,990 --> 00:15:06,530
which believe me is pretty common,

281
00:15:06,530 --> 00:15:09,210
then you end up with an array of promises

282
00:15:09,210 --> 00:15:13,820
that you can then as a next step handle like this.

283
00:15:13,820 --> 00:15:17,143
So with the Promise.all combinator function.

284
00:15:18,320 --> 00:15:21,630
And so now what the next step is actually pretty easy.

285
00:15:21,630 --> 00:15:25,290
All they have to do is to loop over this array

286
00:15:25,290 --> 00:15:27,993
and add the parallel class to it.

287
00:15:28,990 --> 00:15:31,283
So image element.

288
00:15:33,010 --> 00:15:35,630
And so now we don't want a new array.

289
00:15:35,630 --> 00:15:39,423
We simply want to do something on each of the elements.

290
00:15:40,290 --> 00:15:45,290
And so img.classlist.add parallel

291
00:15:47,870 --> 00:15:50,040
like this.

292
00:15:50,040 --> 00:15:52,533
Let's get rid of this console.log here,

293
00:15:54,210 --> 00:15:55,850
and in our network tab...

294
00:15:57,610 --> 00:16:00,073
Oh, this is pretty big.

295
00:16:02,210 --> 00:16:05,353
So you see the images are all loading there now.

296
00:16:06,730 --> 00:16:07,720
Right?

297
00:16:07,720 --> 00:16:09,220
And here we go!

298
00:16:09,220 --> 00:16:12,090
So now we have the images nicely displayed

299
00:16:12,090 --> 00:16:14,250
and set side-by-side.

300
00:16:14,250 --> 00:16:15,210
Let's make it a bit smaller

301
00:16:15,210 --> 00:16:16,943
so we can actually see something.

302
00:16:18,110 --> 00:16:20,350
Now and indeed, there we go.

303
00:16:20,350 --> 00:16:22,700
Let's just see it one more time.

304
00:16:22,700 --> 00:16:25,373
Also here the resources actually loading.

305
00:16:27,750 --> 00:16:29,993
To see it, we need to make it even smaller.

306
00:16:31,250 --> 00:16:32,900
And so you see that down here,

307
00:16:32,900 --> 00:16:35,430
the three images basically started loading

308
00:16:35,430 --> 00:16:37,070
all at the same time,

309
00:16:37,070 --> 00:16:39,710
which is because of this loop here,

310
00:16:39,710 --> 00:16:41,430
which we'll of course execute

311
00:16:41,430 --> 00:16:44,863
these three callback functions, all one after another.

312
00:16:47,260 --> 00:16:50,534
Now, okay?

313
00:16:50,534 --> 00:16:51,367
Alright.

314
00:16:52,800 --> 00:16:57,210
And with this, we are actually finished with this challenge

315
00:16:57,210 --> 00:17:00,140
and also with this whole section.

316
00:17:00,140 --> 00:17:02,110
So make sure that you understood

317
00:17:02,110 --> 00:17:04,680
what we did here in this part two,

318
00:17:04,680 --> 00:17:06,930
because this is pretty important.

319
00:17:06,930 --> 00:17:11,560
But besides that, your job is now done for this section.

320
00:17:11,560 --> 00:17:14,550
So really happy to still see you here

321
00:17:14,550 --> 00:17:16,520
and still learning JavaScript

322
00:17:16,520 --> 00:17:19,260
and still making progress.

323
00:17:19,260 --> 00:17:23,020
So well done, you can be really proud of yourself.

324
00:17:23,020 --> 00:17:24,760
And I really mean that.

325
00:17:24,760 --> 00:17:28,433
And now I see you back here next time in the next section.

