1
00:00:01,180 --> 00:00:04,053
<v Instructor>Time for coding challenge number two.</v>

2
00:00:05,520 --> 00:00:09,230
And in this one, your goal is to basically recreate

3
00:00:09,230 --> 00:00:12,540
what I'm just gonna show you here on the screen.

4
00:00:12,540 --> 00:00:14,440
So when I opened the page

5
00:00:14,440 --> 00:00:17,480
then there will be an image loading in the background

6
00:00:17,480 --> 00:00:20,520
and as soon as that arrives it is displayed

7
00:00:20,520 --> 00:00:22,790
and after two seconds it disappears,

8
00:00:22,790 --> 00:00:26,010
and another image starts loading in the background,

9
00:00:26,010 --> 00:00:29,420
it is then also displayed and again, after two seconds

10
00:00:29,420 --> 00:00:32,533
it disappeared and that's actually it.

11
00:00:35,040 --> 00:00:37,870
So that's what I say right here.

12
00:00:37,870 --> 00:00:39,690
And so this time the tasks

13
00:00:39,690 --> 00:00:42,790
are actually not gonna be really descriptive.

14
00:00:42,790 --> 00:00:45,470
And so in this one, you should now pretend

15
00:00:45,470 --> 00:00:48,600
that you're actually working on your own.

16
00:00:48,600 --> 00:00:50,590
So at least a little bit.

17
00:00:50,590 --> 00:00:55,003
And in fact, this challenge is difficult on purpose.

18
00:00:56,091 --> 00:00:58,610
So this is not an easy one

19
00:00:58,610 --> 00:01:02,090
but I hope that with some time and with some effort

20
00:01:02,090 --> 00:01:04,910
and also with revealing everything that we learned

21
00:01:04,910 --> 00:01:07,170
so far in the section,

22
00:01:07,170 --> 00:01:11,070
you can at least complete parts of this challenge.

23
00:01:11,070 --> 00:01:15,770
But anyway let's now, still take a look at your tasks here.

24
00:01:15,770 --> 00:01:19,610
So I want you to create a function called create image

25
00:01:19,610 --> 00:01:24,610
which receives as an input, a variable called image path.

26
00:01:24,650 --> 00:01:27,350
So this is basically the path to an image

27
00:01:27,350 --> 00:01:29,520
that I'll show you in a minute.

28
00:01:29,520 --> 00:01:31,890
Now this function should return a promise

29
00:01:31,890 --> 00:01:34,550
which creates a new image.

30
00:01:34,550 --> 00:01:38,860
So really a new image in the DOM info that you can use

31
00:01:38,860 --> 00:01:43,480
a document.createElement with the image tag.

32
00:01:43,480 --> 00:01:45,510
And so this is how we learn to do it

33
00:01:45,510 --> 00:01:48,633
in the advanced DOM section, right?

34
00:01:49,660 --> 00:01:53,430
So you create that image and you set the source attribute

35
00:01:53,430 --> 00:01:57,510
to the provided image path that you received here.

36
00:01:57,510 --> 00:01:59,280
And as you already know

37
00:01:59,280 --> 00:02:04,260
this setting, the source path is an asynchronous operation.

38
00:02:04,260 --> 00:02:06,690
And so basically your task

39
00:02:06,690 --> 00:02:11,000
in this part one is to promisifying all of that.

40
00:02:11,000 --> 00:02:13,800
So when the image is done loading

41
00:02:13,800 --> 00:02:15,420
you should append that image

42
00:02:15,420 --> 00:02:19,080
to the DOM element that has the images class

43
00:02:19,080 --> 00:02:21,730
and then resolve the promise.

44
00:02:21,730 --> 00:02:24,290
And to fulfill the value of the promise

45
00:02:24,290 --> 00:02:26,633
should be the image element itself.

46
00:02:27,990 --> 00:02:29,600
And in case there is an error

47
00:02:29,600 --> 00:02:31,970
while the image is being loaded,

48
00:02:31,970 --> 00:02:36,490
and so that is the error event that you need to listen for,

49
00:02:36,490 --> 00:02:38,823
so in that case, reject the promise.

50
00:02:39,830 --> 00:02:42,972
And again, if this part is too tricky for you,

51
00:02:42,972 --> 00:02:47,550
then you can always just start watching the solution

52
00:02:47,550 --> 00:02:51,940
at least for this part, all right?

53
00:02:51,940 --> 00:02:54,333
And so after the first part of promisifying,

54
00:02:55,240 --> 00:02:58,933
the image loading comes of course consuming that promise.

55
00:03:00,120 --> 00:03:02,210
So after the image has loaded

56
00:03:02,210 --> 00:03:05,560
I want you to pause the execution for two seconds

57
00:03:05,560 --> 00:03:09,540
using the wait function that we created previously.

58
00:03:09,540 --> 00:03:12,660
Then after these two seconds have passed,

59
00:03:12,660 --> 00:03:14,930
I want you to hide the current image

60
00:03:14,930 --> 00:03:17,060
by setting display to none.

61
00:03:17,060 --> 00:03:20,380
Now then you should load a second image.

62
00:03:20,380 --> 00:03:24,740
Now, in order to hide the current image, my hint here

63
00:03:24,740 --> 00:03:27,760
that you use the image element that was returned

64
00:03:27,760 --> 00:03:30,093
by the create image promise.

65
00:03:31,120 --> 00:03:34,250
So remember that the result value of the promise

66
00:03:34,250 --> 00:03:37,330
should be the actual image element itself.

67
00:03:37,330 --> 00:03:40,720
And so you can use that element to hide it.

68
00:03:40,720 --> 00:03:43,890
You will just need a global variable for that.

69
00:03:43,890 --> 00:03:46,390
But I hope that once you reach this part,

70
00:03:46,390 --> 00:03:48,163
you will notice that for yourself.

71
00:03:49,510 --> 00:03:52,790
Anyway, after the second image has loaded,

72
00:03:52,790 --> 00:03:57,500
so this part here in the step number four,

73
00:03:57,500 --> 00:03:59,150
so after this has happened

74
00:03:59,150 --> 00:04:01,714
I want you to pause execution again, for two seconds.

75
00:04:01,714 --> 00:04:06,330
And then after these two seconds have passed

76
00:04:06,330 --> 00:04:08,193
hide again the current image.

77
00:04:09,240 --> 00:04:14,040
So just to make sure you understood what exactly is needed

78
00:04:14,040 --> 00:04:16,380
this is here what should happen.

79
00:04:16,380 --> 00:04:18,980
So the image is loading, then it's displaying,

80
00:04:18,980 --> 00:04:22,580
then it's hiding and loading again,

81
00:04:22,580 --> 00:04:25,483
and so now it's hidden one more time.

82
00:04:26,660 --> 00:04:30,423
Now the images for doing this are here in this image folder.

83
00:04:31,720 --> 00:04:35,310
And so the path to these images is gonna be image,

84
00:04:35,310 --> 00:04:38,387
so IMG/ and then IMG-1.jpg and IMG-2.jpg.

85
00:04:43,900 --> 00:04:46,260
And here to actually see this effect

86
00:04:46,260 --> 00:04:51,260
go to the network tab and set your speed to fast 3G,

87
00:04:51,760 --> 00:04:55,560
because otherwise the images are going to load too fast

88
00:04:55,560 --> 00:04:57,653
for you to actually see any effect.

89
00:05:00,742 --> 00:05:04,920
So again don't stress if this becomes overwhelming

90
00:05:04,920 --> 00:05:06,690
and too difficult.

91
00:05:06,690 --> 00:05:08,440
So I designed this one on purpose

92
00:05:08,440 --> 00:05:11,110
to be a real challenge for you.

93
00:05:11,110 --> 00:05:14,090
And so if you need to watch parts of the solution,

94
00:05:14,090 --> 00:05:16,163
then don't worry about that at all.

95
00:05:17,670 --> 00:05:20,583
As always what matters is that you actually try.

96
00:05:21,420 --> 00:05:23,800
But anyway, good luck for this one

97
00:05:23,800 --> 00:05:25,510
and take all the time you need

98
00:05:25,510 --> 00:05:27,103
and then I see you back here.

99
00:05:31,010 --> 00:05:33,370
Okay, welcome back.

100
00:05:33,370 --> 00:05:37,140
So I hope that you did at least part of it.

101
00:05:37,140 --> 00:05:41,100
And so let's start with the solution here.

102
00:05:41,100 --> 00:05:46,100
So create image, which should take in an image path.

103
00:05:50,470 --> 00:05:53,510
And then whenever we are promised to find something

104
00:05:53,510 --> 00:05:57,660
we always return in you promise,

105
00:05:57,660 --> 00:06:01,500
and also the promise is always done in the same way,

106
00:06:01,500 --> 00:06:03,170
at least in the beginning.

107
00:06:03,170 --> 00:06:06,255
So we have to resolve function and de reject function

108
00:06:06,255 --> 00:06:10,793
which are received by our executer function.

109
00:06:13,256 --> 00:06:16,040
Now we are told to create a new image

110
00:06:16,040 --> 00:06:19,103
using document.createElement.

111
00:06:21,680 --> 00:06:25,790
And so we want to create an element of the type image

112
00:06:25,790 --> 00:06:26,953
and to that IMG.

113
00:06:27,970 --> 00:06:29,580
And then all we need to do

114
00:06:29,580 --> 00:06:32,650
is to set the source property of that,

115
00:06:32,650 --> 00:06:35,193
to the image path that is received.

116
00:06:37,870 --> 00:06:42,793
And so then on that image, we can wait for the load event.

117
00:06:47,200 --> 00:06:51,790
And so let's see what was the task here.

118
00:06:51,790 --> 00:06:53,270
So when the image is done loading

119
00:06:53,270 --> 00:06:57,090
append it to the DOM element with the images class

120
00:06:57,090 --> 00:07:00,803
and to resolve the promise with the image element itself.

121
00:07:03,680 --> 00:07:08,680
So that's out here select the element with the images class.

122
00:07:10,720 --> 00:07:15,720
So ImgContainer, let's say, dot querySelector images.

123
00:07:21,890 --> 00:07:24,113
Let's just take a look here in the HTML.

124
00:07:25,000 --> 00:07:27,533
And so that's this element here.

125
00:07:33,700 --> 00:07:37,970
And so again we should now append the image to that element.

126
00:07:37,970 --> 00:07:41,900
And so that's, ImgContainer.append,

127
00:07:41,900 --> 00:07:46,210
just again like we learned in the advanced DOM section.

128
00:07:46,210 --> 00:07:48,110
So if you skipped that one,

129
00:07:48,110 --> 00:07:50,803
then maybe you need it to this part of the solution.

130
00:07:53,410 --> 00:07:56,760
But anyway, now we also want to resolve the promise

131
00:07:56,760 --> 00:08:00,750
because this load event of course means

132
00:08:00,750 --> 00:08:03,280
that loading the image was successful.

133
00:08:03,280 --> 00:08:06,680
And so this is where we will then resolve the promise,

134
00:08:06,680 --> 00:08:09,710
so mark it as successful

135
00:08:09,710 --> 00:08:12,733
and remember the resolved value should be the image.

136
00:08:13,810 --> 00:08:18,753
And now we should also listen to the error event, remember?

137
00:08:21,400 --> 00:08:25,710
And so in this case, we will then reject the promise

138
00:08:25,710 --> 00:08:27,873
with a new error as always.

139
00:08:29,190 --> 00:08:31,600
And let's say image not found

140
00:08:31,600 --> 00:08:34,743
because that is probably the most likely error.

141
00:08:37,270 --> 00:08:39,380
So here it actually says

142
00:08:39,380 --> 00:08:41,330
that we should test the error handler

143
00:08:41,330 --> 00:08:43,213
by passing a wrong image path.

144
00:08:44,240 --> 00:08:48,173
And so the error message here that makes sense is this one.

145
00:08:50,890 --> 00:08:54,170
And so this should actually complete part one

146
00:08:54,170 --> 00:08:57,100
and I know that I'm doing it quite fast here

147
00:08:57,100 --> 00:09:01,040
but that's because we actually did many of the things here

148
00:09:01,040 --> 00:09:04,690
already before but simply in a different context

149
00:09:04,690 --> 00:09:08,080
but we already know what resolve and reject do.

150
00:09:08,080 --> 00:09:10,653
And so this, I think should be understandable.

151
00:09:13,110 --> 00:09:16,210
But anyway, let's now handle the fulfilled,

152
00:09:16,210 --> 00:09:19,500
so the successful promise,

153
00:09:19,500 --> 00:09:22,477
and so that's this part here.

154
00:09:22,477 --> 00:09:25,370
And so remember that here we received the image

155
00:09:26,650 --> 00:09:28,003
as the resolved to value.

156
00:09:29,370 --> 00:09:33,150
And I'll actually, we don't need to really do anything here,

157
00:09:33,150 --> 00:09:35,650
so because the image is already

158
00:09:35,650 --> 00:09:39,300
being appended to the DOM up here.

159
00:09:39,300 --> 00:09:41,250
And so for now, at least

160
00:09:41,250 --> 00:09:43,750
we can just lock something to the console,

161
00:09:43,750 --> 00:09:46,500
like image one, load it,

162
00:09:46,500 --> 00:09:50,200
and then a bit later we will actually worry about

163
00:09:50,200 --> 00:09:51,993
waiting these two seconds.

164
00:09:52,960 --> 00:09:54,993
So let's go here to our part.

165
00:09:56,781 --> 00:10:00,260
And of course, I need to actually pass in the path

166
00:10:00,260 --> 00:10:01,203
so the image.

167
00:10:02,160 --> 00:10:04,300
So as I said, that's an image

168
00:10:04,300 --> 00:10:09,300
and VS code is nice enough to give us that path.

169
00:10:10,870 --> 00:10:13,653
And indeed here is the image already.

170
00:10:14,680 --> 00:10:18,623
So as I said, I will just set it here to fast, 3G now.

171
00:10:19,910 --> 00:10:21,940
And so now you see it's taking some time

172
00:10:24,470 --> 00:10:26,890
but eventually it will arrive.

173
00:10:26,890 --> 00:10:29,400
And so as it arrived after that,

174
00:10:29,400 --> 00:10:32,720
then we lock to the console image one loaded.

175
00:10:32,720 --> 00:10:35,140
And so again that happened

176
00:10:35,140 --> 00:10:37,633
because the promise was actually resolved.

177
00:10:39,950 --> 00:10:43,913
That's also right away at the catch handler.

178
00:10:47,840 --> 00:10:50,170
And so here we just want to log the error

179
00:10:51,100 --> 00:10:52,783
and let's format just nicely.

180
00:10:54,870 --> 00:10:57,610
So let's just change the name here

181
00:10:59,690 --> 00:11:04,253
and now we get or error, so image not found.

182
00:11:06,650 --> 00:11:10,320
And so now here, we could do something more realistic

183
00:11:10,320 --> 00:11:12,830
like giving the user a real error message

184
00:11:12,830 --> 00:11:15,530
or something here on the screen,

185
00:11:15,530 --> 00:11:18,313
but in this case that's simply not necessary.

186
00:11:19,900 --> 00:11:24,900
So let's go back here and tackle step number three,

187
00:11:25,200 --> 00:11:28,640
which is to pause the execution for two seconds

188
00:11:28,640 --> 00:11:31,790
using this wait function we created earlier.

189
00:11:31,790 --> 00:11:33,283
So let's grabbed that here.

190
00:11:34,420 --> 00:11:38,817
So this one and I'm gonna put it right here

191
00:11:42,010 --> 00:11:42,923
at the beginning.

192
00:11:45,750 --> 00:11:49,363
And so now in here, we will wait for two seconds.

193
00:11:50,370 --> 00:11:53,460
And so this is gonna return a promise.

194
00:11:53,460 --> 00:11:57,800
So this part here, and so let's now return that

195
00:11:57,800 --> 00:12:02,363
so that we can chain the next then handler on that.

196
00:12:03,530 --> 00:12:06,943
And wait doesn't have any resolved value, remember.

197
00:12:08,628 --> 00:12:13,628
And so we don't specify any argument

198
00:12:13,730 --> 00:12:16,200
or any parameter in this function.

199
00:12:16,200 --> 00:12:18,760
And now remember, here what we want to do,

200
00:12:18,760 --> 00:12:21,500
is to then hide this first image.

201
00:12:21,500 --> 00:12:25,510
So this one, however, this image is only defined

202
00:12:25,510 --> 00:12:28,690
in this function but not in this one.

203
00:12:28,690 --> 00:12:30,750
And so that's why I said previously

204
00:12:30,750 --> 00:12:34,183
that we are going to need a global variable to do that.

205
00:12:35,810 --> 00:12:39,713
So let's do current image.

206
00:12:41,160 --> 00:12:45,830
And then here all we do is to set current image

207
00:12:45,830 --> 00:12:50,830
to the image and then we can hide it right here.

208
00:12:51,440 --> 00:12:55,147
So that's currentImg.style.display set to none.

209
00:13:01,900 --> 00:13:03,400
And so this should load the image

210
00:13:03,400 --> 00:13:06,460
and then after two seconds it will hide it.

211
00:13:06,460 --> 00:13:08,110
So let's the wait for it.

212
00:13:08,110 --> 00:13:11,290
One, two, and there we go.

213
00:13:11,290 --> 00:13:15,080
Great, so we have that working as well.

214
00:13:15,080 --> 00:13:20,080
And now load a second image and yeah, that's actually it.

215
00:13:21,840 --> 00:13:24,760
So then we just have to pause execution again

216
00:13:24,760 --> 00:13:29,430
after two seconds and then height the current image again.

217
00:13:29,430 --> 00:13:32,493
And so this one is now gonna be simply the same.

218
00:13:34,230 --> 00:13:38,013
So where are we going to load the next image?

219
00:13:38,910 --> 00:13:40,940
Well, it's gonna be right here

220
00:13:40,940 --> 00:13:44,300
so that we can then chain the next then handler

221
00:13:44,300 --> 00:13:45,633
into our chain here.

222
00:13:46,520 --> 00:13:48,870
So we will return a new promise

223
00:13:48,870 --> 00:13:51,610
which is the one that is returned

224
00:13:51,610 --> 00:13:55,840
by createImage and this time,

225
00:13:55,840 --> 00:13:59,667
so I'm missing the quotes, now okay,

226
00:14:02,200 --> 00:14:03,493
and then another then.

227
00:14:05,110 --> 00:14:08,262
And so here we are back to receiving an image.

228
00:14:08,262 --> 00:14:10,323
And now let's just do exactly the same.

229
00:14:12,910 --> 00:14:15,320
So we assigned the current image to image

230
00:14:15,320 --> 00:14:18,230
so that in the next step we can then hide it,

231
00:14:18,230 --> 00:14:21,723
then image two load it and we wait two more seconds.

232
00:14:23,207 --> 00:14:25,183
And then in the next handler,

233
00:14:27,860 --> 00:14:30,403
we hide the current image again.

234
00:14:33,080 --> 00:14:34,773
And so let's see.

235
00:14:36,140 --> 00:14:38,180
So after the second image has loaded

236
00:14:38,180 --> 00:14:43,180
pause execution for two seconds again, check that we did.

237
00:14:43,200 --> 00:14:45,140
And then after two seconds have passed

238
00:14:45,140 --> 00:14:49,010
hide to current image, so check again.

239
00:14:49,010 --> 00:14:52,793
So we did both and so our code should be complete now.

240
00:14:53,800 --> 00:14:55,143
And so let's wait for it.

241
00:14:56,660 --> 00:15:00,550
One, two, and there it goes,

242
00:15:00,550 --> 00:15:03,090
so now the second one is loading in the background

243
00:15:03,090 --> 00:15:06,580
and one, two seconds and that's it.

244
00:15:06,580 --> 00:15:10,310
That's our very small mini application

245
00:15:10,310 --> 00:15:12,990
which had the simple goal of showing you

246
00:15:12,990 --> 00:15:16,470
how we can promisify this logic here

247
00:15:16,470 --> 00:15:19,520
of setting the source attribute of an image,

248
00:15:19,520 --> 00:15:22,080
basically asynchronously.

249
00:15:22,080 --> 00:15:25,860
So I hope that you managed to do this part here,

250
00:15:25,860 --> 00:15:27,860
so promisifying all that.

251
00:15:27,860 --> 00:15:30,150
And also then understanding the logic

252
00:15:30,150 --> 00:15:32,400
that I wanted to implement here.

253
00:15:32,400 --> 00:15:34,770
And if you did something a little bit different

254
00:15:34,770 --> 00:15:36,997
then that's of course not a problem at all.

255
00:15:38,480 --> 00:15:39,890
So I keep saying it

256
00:15:39,890 --> 00:15:42,860
but that's just because it's really true.

257
00:15:42,860 --> 00:15:45,270
So what I want is you to try

258
00:15:45,270 --> 00:15:48,070
and to practice and the results will follow.

259
00:15:48,070 --> 00:15:50,583
If not today, then some other day.

