All language subtitles for 15. Building a Simple Promise

af Afrikaans
ak Akan
sq Albanian
am Amharic
ar Arabic
hy Armenian
az Azerbaijani
eu Basque
be Belarusian
bem Bemba
bn Bengali
bh Bihari
bs Bosnian
br Breton
bg Bulgarian
km Cambodian
ca Catalan
ceb Cebuano
chr Cherokee
ny Chichewa
zh-CN Chinese (Simplified)
zh-TW Chinese (Traditional)
co Corsican
hr Croatian
cs Czech
da Danish
nl Dutch
en English
eo Esperanto
et Estonian
ee Ewe
fo Faroese
tl Filipino
fi Finnish
fr French
fy Frisian
gaa Ga
gl Galician
ka Georgian
de German
el Greek
gn Guarani
gu Gujarati
ht Haitian Creole
ha Hausa
haw Hawaiian
iw Hebrew
hi Hindi
hmn Hmong
hu Hungarian
is Icelandic
ig Igbo
id Indonesian
ia Interlingua
ga Irish
it Italian
ja Japanese
jw Javanese
kn Kannada
kk Kazakh
rw Kinyarwanda
rn Kirundi
kg Kongo
ko Korean
kri Krio (Sierra Leone)
ku Kurdish
ckb Kurdish (Soranî)
ky Kyrgyz
lo Laothian
la Latin
lv Latvian
ln Lingala
lt Lithuanian
loz Lozi
lg Luganda
ach Luo
lb Luxembourgish
mk Macedonian
mg Malagasy
ms Malay
ml Malayalam
mt Maltese
mi Maori
mr Marathi
mfe Mauritian Creole
mo Moldavian
mn Mongolian
my Myanmar (Burmese)
sr-ME Montenegrin
ne Nepali
pcm Nigerian Pidgin
nso Northern Sotho
no Norwegian
nn Norwegian (Nynorsk)
oc Occitan
or Oriya
om Oromo
ps Pashto
fa Persian Download
pl Polish
pt-BR Portuguese (Brazil)
pt Portuguese (Portugal)
pa Punjabi
qu Quechua
ro Romanian
rm Romansh
nyn Runyakitara
ru Russian
sm Samoan
gd Scots Gaelic
sr Serbian
sh Serbo-Croatian
st Sesotho
tn Setswana
crs Seychellois Creole
sn Shona
sd Sindhi
si Sinhalese
sk Slovak
sl Slovenian
so Somali
es Spanish
es-419 Spanish (Latin American)
su Sundanese
sw Swahili
sv Swedish
tg Tajik
ta Tamil
tt Tatar
te Telugu
th Thai
ti Tigrinya
to Tonga
lua Tshiluba
tum Tumbuka
tr Turkish
tk Turkmen
tw Twi
ug Uighur
uk Ukrainian
ur Urdu
uz Uzbek
vi Vietnamese
cy Welsh
wo Wolof
xh Xhosa
yi Yiddish
yo Yoruba
zu Zulu
Would you like to inspect the original subtitles? These are the user uploaded subtitles that are being translated: 1 1 00:00:01,360 --> 00:00:03,570 So at this point of the section, 2 2 00:00:03,570 --> 00:00:06,340 you know all about consuming promises 3 3 00:00:06,340 --> 00:00:10,130 but we have never actually built our own promise. 4 4 00:00:10,130 --> 00:00:12,633 And so let's do that in this lecture. 5 5 00:00:14,360 --> 00:00:18,750 And let's go back to our lottery example from the slides 6 6 00:00:18,750 --> 00:00:21,290 and basically simulate a lottery 7 7 00:00:21,290 --> 00:00:23,280 using a promise here. 8 8 00:00:23,280 --> 00:00:26,000 And remember that in that example, 9 9 00:00:26,000 --> 00:00:29,370 a fulfilled promise means to win the lottery 10 10 00:00:29,370 --> 00:00:32,840 while a rejected promise means to lose. 11 11 00:00:32,840 --> 00:00:34,710 So let's get to work 12 12 00:00:34,710 --> 00:00:39,470 and we create a new promise using the promise constructor. 13 13 00:00:39,470 --> 00:00:43,460 So that's new promise like this. 14 14 00:00:43,460 --> 00:00:46,560 So just like many other built-in objects. 15 15 00:00:46,560 --> 00:00:49,560 And so what this means is that promises 16 16 00:00:49,560 --> 00:00:54,560 are essentially just a special kind of object in JavaScript. 17 17 00:00:54,780 --> 00:00:59,270 Now the promise constructor takes exactly one argument 18 18 00:00:59,270 --> 00:01:02,163 and that is the so-called executor function. 19 19 00:01:04,550 --> 00:01:07,253 So we need to pass in a function here. 20 20 00:01:08,150 --> 00:01:11,690 And so again, this one is called executor. 21 21 00:01:11,690 --> 00:01:14,980 Now, as soon as the promise constructor runs, 22 22 00:01:14,980 --> 00:01:19,180 it will automatically execute this executor function 23 23 00:01:19,180 --> 00:01:20,530 that we pass in. 24 24 00:01:20,530 --> 00:01:23,620 And as it executes this function here, 25 25 00:01:23,620 --> 00:01:27,420 it will do so by passing in two other arguments. 26 26 00:01:27,420 --> 00:01:32,420 And those arguments are the resolve and reject functions. 27 27 00:01:34,030 --> 00:01:36,903 So reject like this. 28 28 00:01:37,800 --> 00:01:40,270 So we will use them here in a second, 29 29 00:01:40,270 --> 00:01:43,963 but for now let's actually build this executor function. 30 30 00:01:45,030 --> 00:01:48,400 And also we should probably store the result. 31 31 00:01:48,400 --> 00:01:51,373 So this new promise in some variable, 32 32 00:01:52,410 --> 00:01:55,003 so lottery promise. 33 33 00:01:57,340 --> 00:01:59,850 All of this here we'll create a new promise 34 34 00:01:59,850 --> 00:02:02,720 that we're gonna store into this variable. 35 35 00:02:02,720 --> 00:02:05,590 So it's just like, for example, the fetch function, 36 36 00:02:05,590 --> 00:02:07,763 which also creates a new promise. 37 37 00:02:08,610 --> 00:02:12,340 Now this executor function that we specified here 38 38 00:02:12,340 --> 00:02:16,200 is the function which will contain the asynchronous behavior 39 39 00:02:16,200 --> 00:02:19,000 that we're trying to handle with the promise. 40 40 00:02:19,000 --> 00:02:20,760 So this executor function 41 41 00:02:20,760 --> 00:02:24,290 should eventually produce a result value. 42 42 00:02:24,290 --> 00:02:26,070 So the value that's basically 43 43 00:02:26,070 --> 00:02:29,440 gonna be the future value of the promise. 44 44 00:02:29,440 --> 00:02:31,410 And so let's do exactly that 45 45 00:02:31,410 --> 00:02:33,780 right here in the executor function 46 46 00:02:33,780 --> 00:02:36,940 and starting with a simplified version. 47 47 00:02:36,940 --> 00:02:39,200 Now, in our lottery example, 48 48 00:02:39,200 --> 00:02:43,760 let's say that we actually win in 50% of the cases 49 49 00:02:43,760 --> 00:02:46,810 and to lose in the other 50%. 50 50 00:02:46,810 --> 00:02:49,170 So a very simplified example, 51 51 00:02:49,170 --> 00:02:51,990 just to make this a bit more fun. 52 52 00:02:51,990 --> 00:02:53,020 And so what I'm gonna do 53 53 00:02:53,020 --> 00:02:55,750 is to simply generate a random number 54 54 00:02:55,750 --> 00:02:59,840 which remember is gonna be between zero and one. 55 55 00:02:59,840 --> 00:03:01,380 And so I can simply say, 56 56 00:03:01,380 --> 00:03:05,633 if this number here is greater or equal than 0.5, 57 57 00:03:07,320 --> 00:03:11,450 then I want to call the resolve function. 58 58 00:03:11,450 --> 00:03:14,820 And so now this is where this resolve function 59 59 00:03:14,820 --> 00:03:19,023 that was passed into the executor function comes into play. 60 60 00:03:22,182 --> 00:03:23,500 In this situation here, 61 61 00:03:23,500 --> 00:03:26,020 we say that we win the lottery. 62 62 00:03:26,020 --> 00:03:29,790 And so therefore that means a fulfilled promise. 63 63 00:03:29,790 --> 00:03:33,250 And in order to set the promise as fulfilled, 64 64 00:03:33,250 --> 00:03:36,000 we use the resolve function. 65 65 00:03:36,000 --> 00:03:39,010 So basically calling the resolve function like this, 66 66 00:03:39,010 --> 00:03:42,800 will Mark this promise as a fulfilled promise, 67 67 00:03:42,800 --> 00:03:45,920 which we can also say a resolved promise. 68 68 00:03:45,920 --> 00:03:48,000 And that's the reason why this method here 69 69 00:03:48,000 --> 00:03:49,970 is called resolve. 70 70 00:03:49,970 --> 00:03:52,110 Now into the resolved function here 71 71 00:03:52,110 --> 00:03:55,440 we pass the fulfilled value of the promise 72 72 00:03:55,440 --> 00:03:59,433 so that it can later be consumed with the den method. 73 73 00:04:00,872 --> 00:04:02,310 So of course we are going to handle 74 74 00:04:02,310 --> 00:04:03,980 the results of this promise 75 75 00:04:03,980 --> 00:04:08,500 just like we handled any other promise with the den method. 76 76 00:04:08,500 --> 00:04:11,260 So again, whatever value we pass 77 77 00:04:11,260 --> 00:04:13,300 into the resolve function here 78 78 00:04:13,300 --> 00:04:15,693 is gonna be the result of the promise 79 79 00:04:15,693 --> 00:04:19,360 that will be available in the den handler. 80 80 00:04:19,360 --> 00:04:24,360 And so in this case, let's simply pass in a string here 81 81 00:04:24,520 --> 00:04:29,520 and let's use some emoji again to make it a bit more fun. 82 82 00:04:30,650 --> 00:04:33,650 And so now let's handle the opposite case. 83 83 00:04:33,650 --> 00:04:38,630 So where we basically want to Mark this promise as rejected. 84 84 00:04:38,630 --> 00:04:41,040 And so, as you can imagine for that 85 85 00:04:41,040 --> 00:04:44,690 we can call the reject function. 86 86 00:04:44,690 --> 00:04:46,570 Then into the reject function, 87 87 00:04:46,570 --> 00:04:48,440 we pass in the error message 88 88 00:04:48,440 --> 00:04:52,060 that we later want to be able in the catch handler, 89 89 00:04:52,060 --> 00:04:53,423 so in the catch method. 90 90 00:04:56,550 --> 00:05:00,100 So here, let's just say you lost your money 91 91 00:05:00,980 --> 00:05:04,473 and then just some poop emoji. 92 92 00:05:07,610 --> 00:05:09,833 So give this a safe here. 93 93 00:05:11,310 --> 00:05:15,010 So just to quickly recap, before we consume this promise 94 94 00:05:15,010 --> 00:05:17,970 here, we created an executor function 95 95 00:05:17,970 --> 00:05:21,600 which is gonna be called by this promise constructor 96 96 00:05:21,600 --> 00:05:23,540 as soon as it runs, 97 97 00:05:23,540 --> 00:05:25,083 so basically immediately. 98 98 00:05:26,710 --> 00:05:29,330 Then the promise calls this function 99 99 00:05:29,330 --> 00:05:32,930 and passes in the resolve and the reject functions 100 100 00:05:32,930 --> 00:05:34,920 so that we can then use them 101 101 00:05:34,920 --> 00:05:39,810 to mark the promise as either resolved so as fulfilled 102 102 00:05:39,810 --> 00:05:42,020 or as to rejected. 103 103 00:05:42,020 --> 00:05:44,020 And so you see that this promise 104 104 00:05:44,020 --> 00:05:46,720 is eventually going to move to either 105 105 00:05:46,720 --> 00:05:50,470 the fulfilled state or the rejected state. 106 106 00:05:50,470 --> 00:05:53,560 So we always need to make sure that the promise ends up 107 107 00:05:53,560 --> 00:05:55,423 in one of these two states. 108 108 00:05:57,314 --> 00:05:59,760 And so now it's time to actually try this out 109 109 00:05:59,760 --> 00:06:02,563 by consuming this promise that we just built. 110 110 00:06:05,060 --> 00:06:06,500 So lottery promise 111 111 00:06:06,500 --> 00:06:10,040 is going to be a promise object at this point. 112 112 00:06:10,040 --> 00:06:11,530 And so then as always, 113 113 00:06:11,530 --> 00:06:14,600 we can call the den method, 114 114 00:06:14,600 --> 00:06:16,360 and then just like before 115 115 00:06:16,360 --> 00:06:19,350 the den method needs a callback function 116 116 00:06:19,350 --> 00:06:20,690 that is going to be called 117 117 00:06:20,690 --> 00:06:24,110 with the resolved value of the promise. 118 118 00:06:24,110 --> 00:06:26,020 So that's call this res here 119 119 00:06:27,490 --> 00:06:30,513 and then let's simply log it to the console. 120 120 00:06:32,120 --> 00:06:35,643 And of course, once again, this could be any name here. 121 121 00:06:38,470 --> 00:06:40,973 And now let's also catch any errors, 122 122 00:06:43,440 --> 00:06:46,060 then so here also as always, 123 123 00:06:46,060 --> 00:06:49,863 we will simply log it to the console as an error. 124 124 00:06:52,413 --> 00:06:55,360 Now, so that's actually it already. 125 125 00:06:55,360 --> 00:06:59,950 So what do you think this res value here is going to be, 126 126 00:06:59,950 --> 00:07:02,270 or this error is going to be. 127 127 00:07:02,270 --> 00:07:05,190 Well, as I just explained before 128 128 00:07:05,190 --> 00:07:07,740 the resolved value of the promise 129 129 00:07:07,740 --> 00:07:11,500 is going to be this one that we pass in here. 130 130 00:07:11,500 --> 00:07:13,990 And so therefore the value that we're gonna log 131 131 00:07:13,990 --> 00:07:16,630 in the case that the promise is successful 132 132 00:07:16,630 --> 00:07:19,290 is going to be exactly this string 133 133 00:07:19,290 --> 00:07:21,587 that we passed into the result function 134 134 00:07:21,587 --> 00:07:24,240 and the same is to with the error. 135 135 00:07:24,240 --> 00:07:28,330 So the error here is going to be simply this one 136 136 00:07:28,330 --> 00:07:30,750 because that's the string that we passed 137 137 00:07:30,750 --> 00:07:32,893 into the reject function. 138 138 00:07:34,530 --> 00:07:38,550 So let's see and indeed we get or error, 139 139 00:07:38,550 --> 00:07:40,093 so you lost your money. 140 140 00:07:41,040 --> 00:07:42,800 And so as we keep reloading, 141 141 00:07:42,800 --> 00:07:45,160 we should then see these different states 142 142 00:07:45,160 --> 00:07:48,823 according to this random number that was generated here. 143 143 00:07:50,180 --> 00:07:52,363 Great, so now we won. 144 144 00:07:53,670 --> 00:07:55,320 And so as we keep doing this, 145 145 00:07:55,320 --> 00:07:59,600 we can see the different States that the promise will take. 146 146 00:07:59,600 --> 00:08:03,750 So that's amazing but however, right now 147 147 00:08:03,750 --> 00:08:06,023 this is not really asynchronous yet. 148 148 00:08:07,350 --> 00:08:10,500 So let's actually simulate this lottery draw 149 149 00:08:10,500 --> 00:08:12,550 by adding a simple timer. 150 150 00:08:12,550 --> 00:08:15,080 And so this timer will then simulate 151 151 00:08:15,080 --> 00:08:18,810 the time data is passed between buying the lottery ticket 152 152 00:08:18,810 --> 00:08:21,510 and actually getting the result. 153 153 00:08:21,510 --> 00:08:23,963 So let's add a set time out here. 154 154 00:08:28,330 --> 00:08:30,830 So with a simple callback function 155 155 00:08:30,830 --> 00:08:33,770 and let's run it for two seconds 156 156 00:08:33,770 --> 00:08:38,343 and here we will simply take this code and put it here. 157 157 00:08:39,180 --> 00:08:42,120 And then we can also immediately lock something 158 158 00:08:42,120 --> 00:08:47,120 to the console, like a lottery draw is happening, 159 159 00:08:50,240 --> 00:08:52,803 and then let's add like a crystal ball here. 160 160 00:08:54,400 --> 00:08:57,663 So that's exactly also what we had in the slides. 161 161 00:09:00,020 --> 00:09:02,200 And now another thing that we can do 162 162 00:09:02,200 --> 00:09:05,590 is to, instead of passing just a string here, 163 163 00:09:05,590 --> 00:09:08,410 we can also create a new error object. 164 164 00:09:08,410 --> 00:09:10,533 So basically creating a real error, 165 165 00:09:11,650 --> 00:09:13,823 and so that's a little bit better. 166 166 00:09:16,580 --> 00:09:18,290 So just like this. 167 167 00:09:18,290 --> 00:09:19,150 And so with this, 168 168 00:09:19,150 --> 00:09:21,430 we made this whole promise here 169 169 00:09:21,430 --> 00:09:23,350 make a little bit more sense 170 170 00:09:23,350 --> 00:09:25,470 because now by using this timer, 171 171 00:09:25,470 --> 00:09:29,520 we did actually encapsulate some asynchronous behavior 172 172 00:09:29,520 --> 00:09:31,275 into this promise. 173 173 00:09:31,275 --> 00:09:33,190 And so that's the whole point of promises 174 174 00:09:33,190 --> 00:09:34,313 in the first place. 175 175 00:09:35,870 --> 00:09:38,820 So let's give it a safe to see what happens. 176 176 00:09:38,820 --> 00:09:41,010 So immediately we get this year 177 177 00:09:41,010 --> 00:09:45,240 and then after two seconds the promise was resolved. 178 178 00:09:45,240 --> 00:09:48,440 And so then here we handled that result 179 179 00:09:48,440 --> 00:09:50,023 and logged it to the console. 180 180 00:09:51,190 --> 00:09:52,450 Let's try again, 181 181 00:09:52,450 --> 00:09:55,400 and of course, again, this one comes immediately 182 182 00:09:56,350 --> 00:09:57,550 and we win again. 183 183 00:09:57,550 --> 00:09:59,033 Let's see if we can lose, 184 184 00:10:00,020 --> 00:10:03,490 and apparently we can only ever win. 185 185 00:10:03,490 --> 00:10:04,833 Nah, but here you go. 186 186 00:10:05,710 --> 00:10:09,840 So now we get the error message just like before 187 187 00:10:09,840 --> 00:10:12,570 but we also now see there is an error, 188 188 00:10:12,570 --> 00:10:15,820 and it also tells us where this error is coming from. 189 189 00:10:15,820 --> 00:10:17,663 So right at line two, nine two, 190 190 00:10:18,830 --> 00:10:20,780 so that's right here. 191 191 00:10:20,780 --> 00:10:25,150 And so indeed actually creating a new error object 192 192 00:10:25,150 --> 00:10:27,590 is actually a bit better. 193 193 00:10:27,590 --> 00:10:30,450 Great, so this is how we encapsulate 194 194 00:10:30,450 --> 00:10:34,030 any asynchronous behavior into a promise. 195 195 00:10:34,030 --> 00:10:38,020 So how we abstracted away in a very nice way, 196 196 00:10:38,020 --> 00:10:39,723 just like we did here. 197 197 00:10:41,580 --> 00:10:43,220 And then all we have to do 198 198 00:10:43,220 --> 00:10:46,350 is to consume that promise like this. 199 199 00:10:46,350 --> 00:10:49,900 And so this is a really nice and helpful pattern. 200 200 00:10:49,900 --> 00:10:53,530 Now, in practice, most of the time all we actually do 201 201 00:10:53,530 --> 00:10:55,820 is to consume promises. 202 202 00:10:55,820 --> 00:10:58,420 And we usually only built promises 203 203 00:10:58,420 --> 00:11:00,220 to basically wrap old 204 204 00:11:00,220 --> 00:11:03,400 callback based functions into promises. 205 205 00:11:03,400 --> 00:11:06,970 And this is a process that we call promisifying. 206 206 00:11:06,970 --> 00:11:08,920 So basically promisifying 207 207 00:11:08,920 --> 00:11:12,650 means to convert callback based asynchronous behavior 208 208 00:11:12,650 --> 00:11:14,173 to promise based. 209 209 00:11:16,850 --> 00:11:20,180 Let's see that in action a little bit. 210 210 00:11:20,180 --> 00:11:21,700 And so what we're gonna do 211 211 00:11:21,700 --> 00:11:25,440 is to actually promisify the set timeout function 212 212 00:11:25,440 --> 00:11:27,323 and create a wait function. 213 213 00:11:30,190 --> 00:11:32,610 So let's create a function called wait 214 214 00:11:34,760 --> 00:11:38,623 and this function is going to take in a number of seconds. 215 215 00:11:42,610 --> 00:11:44,730 And so now inside of this function 216 216 00:11:44,730 --> 00:11:48,150 we will actually create and return the promise. 217 217 00:11:48,150 --> 00:11:50,870 So usually that's always what we do. 218 218 00:11:50,870 --> 00:11:52,290 So creating a function 219 219 00:11:52,290 --> 00:11:54,860 and then from there returning a promise. 220 220 00:11:54,860 --> 00:11:56,570 And so this will then encapsulate 221 221 00:11:56,570 --> 00:11:59,610 the asynchronous operation even further. 222 222 00:11:59,610 --> 00:12:03,113 So essentially that's also what the fetch function does. 223 223 00:12:04,676 --> 00:12:07,320 It's a function that returns a promise, 224 224 00:12:07,320 --> 00:12:09,620 and so that is exactly what we will do 225 225 00:12:09,620 --> 00:12:11,790 here with this wait function. 226 226 00:12:11,790 --> 00:12:15,703 So in a sense this here is a more real world example. 227 227 00:12:18,176 --> 00:12:21,900 So promisifying set timeout. 228 228 00:12:24,830 --> 00:12:28,020 As I was saying, we are going to return a new promise 229 229 00:12:31,220 --> 00:12:34,430 and then or executor function as always, 230 230 00:12:34,430 --> 00:12:36,540 and then resolve. 231 231 00:12:36,540 --> 00:12:37,390 And in this case, 232 232 00:12:37,390 --> 00:12:40,840 we actually don't even need the reject function. 233 233 00:12:40,840 --> 00:12:43,540 And that's because it's actually impossible 234 234 00:12:43,540 --> 00:12:45,850 for the timer to fail. 235 235 00:12:45,850 --> 00:12:46,860 And so therefore 236 236 00:12:46,860 --> 00:12:50,410 we will never mark this promise as rejected. 237 237 00:12:50,410 --> 00:12:52,140 And so here we don't even need 238 238 00:12:52,140 --> 00:12:55,743 to specify debt reject parameter. 239 239 00:12:59,260 --> 00:13:02,260 It's just like the array methods like map 240 240 00:13:02,260 --> 00:13:04,610 which always receive three arguments 241 241 00:13:04,610 --> 00:13:08,023 but most of the time we just use one or two of them. 242 242 00:13:09,100 --> 00:13:11,240 And so this is similar, 243 243 00:13:11,240 --> 00:13:16,240 but anyway, all we have to do now is to use set timeout. 244 244 00:13:16,660 --> 00:13:18,083 And then here the callback function 245 245 00:13:18,083 --> 00:13:21,530 that we want to be called after a certain time 246 246 00:13:21,530 --> 00:13:24,410 is exactly the resolve function. 247 247 00:13:24,410 --> 00:13:25,993 So we can simply do this. 248 248 00:13:26,830 --> 00:13:29,900 And in this case, we're actually not even going to pass 249 249 00:13:29,900 --> 00:13:33,270 any resolved value into the resolve function 250 250 00:13:33,270 --> 00:13:36,450 because that's actually not mandatory. 251 251 00:13:36,450 --> 00:13:38,730 And so in the case of this timer, 252 252 00:13:38,730 --> 00:13:41,110 it's also not really necessary. 253 253 00:13:41,110 --> 00:13:43,220 And so in the case of a timer, 254 254 00:13:43,220 --> 00:13:47,403 it's also not really necessary to wait for some value. 255 255 00:13:48,750 --> 00:13:50,750 So in this case, all we want to do 256 256 00:13:50,750 --> 00:13:53,400 is to basically make our code wait. 257 257 00:13:53,400 --> 00:13:56,793 And so no resolved values are needed. 258 258 00:13:57,810 --> 00:13:59,710 Now, here, we want to run that timer 259 259 00:13:59,710 --> 00:14:02,480 for a certain amount of seconds, 260 260 00:14:02,480 --> 00:14:04,913 so we need to multiply that by 1000. 261 261 00:14:05,790 --> 00:14:07,943 And so that's actually already it. 262 262 00:14:10,460 --> 00:14:14,090 Now, we could improve this even further here 263 263 00:14:14,090 --> 00:14:18,300 or just make it smaller by using error functions. 264 264 00:14:18,300 --> 00:14:22,110 And you can do that if you want to have some fun with that, 265 265 00:14:22,110 --> 00:14:25,693 but for now I will simply now consume this promise. 266 266 00:14:26,610 --> 00:14:29,573 So let's call or wait function. 267 267 00:14:31,440 --> 00:14:33,480 And so this will now create a promise 268 268 00:14:33,480 --> 00:14:35,550 that will wait for two seconds 269 269 00:14:35,550 --> 00:14:39,390 and after these two seconds, it will resolve. 270 270 00:14:39,390 --> 00:14:41,363 And so we can then handle that. 271 271 00:14:42,690 --> 00:14:45,000 And then here in our callback function, 272 272 00:14:45,000 --> 00:14:48,493 remember we are not going to receive any resolved value. 273 273 00:14:49,360 --> 00:14:51,240 So we just leave this empty 274 274 00:14:54,870 --> 00:14:59,870 and then I will simply log, I waited for two seconds. 275 275 00:15:01,100 --> 00:15:02,910 And so here in this callback, 276 276 00:15:02,910 --> 00:15:04,750 we could now run any code 277 277 00:15:04,750 --> 00:15:07,843 that we wanted to be executed after two seconds. 278 278 00:15:09,690 --> 00:15:12,840 And then let's actually wait one more second. 279 279 00:15:12,840 --> 00:15:14,470 And so just like before 280 280 00:15:14,470 --> 00:15:16,833 we now have to return a new promise here, 281 281 00:15:17,960 --> 00:15:22,960 so return, wait, and this time just one second. 282 282 00:15:24,030 --> 00:15:26,720 And so this is exactly what we did before 283 283 00:15:26,720 --> 00:15:30,590 when we wanted to chain two sequential Ajax calls 284 284 00:15:30,590 --> 00:15:31,963 using the fetch function. 285 285 00:15:33,880 --> 00:15:35,850 So in the result of the first fetch, 286 286 00:15:35,850 --> 00:15:39,548 we would create a new fetch and return it. 287 287 00:15:39,548 --> 00:15:41,430 And so that's what we're doing here, 288 288 00:15:41,430 --> 00:15:45,800 and so then therefore all of this returns a new promise 289 289 00:15:45,800 --> 00:15:48,693 and then we can one more time handle that. 290 290 00:15:52,120 --> 00:15:53,760 And let's just say again, 291 291 00:15:53,760 --> 00:15:56,883 I waited for one second. 292 292 00:15:59,100 --> 00:16:00,353 So give it a safe. 293 293 00:16:01,670 --> 00:16:03,960 So this one waited for two seconds 294 294 00:16:03,960 --> 00:16:06,740 and this one for one second. 295 295 00:16:06,740 --> 00:16:09,010 And of course we also still get the result 296 296 00:16:09,010 --> 00:16:11,070 from the previous one, 297 297 00:16:11,070 --> 00:16:14,930 but for now, this is here what we are interested in. 298 298 00:16:14,930 --> 00:16:16,800 And so now with this, 299 299 00:16:16,800 --> 00:16:20,940 we have once again a nice chain of asynchronous behavior 300 300 00:16:20,940 --> 00:16:23,530 that happens nicely in a sequence 301 301 00:16:23,530 --> 00:16:26,070 and all without the callback hill. 302 302 00:16:26,070 --> 00:16:28,720 So before I actually showed you what happened 303 303 00:16:28,720 --> 00:16:32,550 when we had multiple timers. 304 304 00:16:32,550 --> 00:16:34,500 And so basically we could do now 305 305 00:16:34,500 --> 00:16:39,363 this same thing like this. 306 306 00:16:42,870 --> 00:16:46,353 So that's just a copy of here as a reference. 307 307 00:16:53,135 --> 00:16:56,385 And so this example here would be this. 308 308 00:17:00,264 --> 00:17:04,120 So one second past, let's just overwrite this one here. 309 309 00:17:07,140 --> 00:17:09,280 And then here we can simply duplicate 310 310 00:17:09,280 --> 00:17:10,430 this a couple of times. 311 311 00:17:12,850 --> 00:17:14,393 So two seconds past, 312 312 00:17:16,700 --> 00:17:19,150 three seconds and here 313 313 00:17:22,760 --> 00:17:24,233 four seconds past. 314 314 00:17:26,510 --> 00:17:29,400 And so that's going to be exactly the same result 315 315 00:17:29,400 --> 00:17:30,423 as we had here. 316 316 00:17:32,300 --> 00:17:34,040 Of course here it's four, 317 317 00:17:34,040 --> 00:17:36,400 but nevermind, that doesn't really matter. 318 318 00:17:36,400 --> 00:17:38,060 What matters is that now 319 319 00:17:38,060 --> 00:17:40,380 we no longer have this ugly 320 320 00:17:40,380 --> 00:17:43,060 and difficult to understand callback hill, 321 321 00:17:43,060 --> 00:17:45,350 but instead we have this nice sequence 322 322 00:17:45,350 --> 00:17:47,880 of asynchronous behavior. 323 323 00:17:47,880 --> 00:17:50,910 Now finally dare also actually a way 324 324 00:17:50,910 --> 00:17:53,820 to very easy create a fulfilled 325 325 00:17:53,820 --> 00:17:56,183 or a rejected promise immediately. 326 326 00:17:57,020 --> 00:17:59,700 And we had actually already done that 327 327 00:17:59,700 --> 00:18:01,930 in the previous lecture, 328 328 00:18:01,930 --> 00:18:04,560 but it's always good to know that we can do this 329 329 00:18:04,560 --> 00:18:06,780 so let me show it to you again. 330 330 00:18:06,780 --> 00:18:09,790 So we can use promise.resolve. 331 331 00:18:09,790 --> 00:18:12,730 And so basically this is a static method 332 332 00:18:12,730 --> 00:18:14,533 on the promise constructor. 333 333 00:18:16,469 --> 00:18:19,860 And so here we can then pass in the resolved value, 334 334 00:18:19,860 --> 00:18:24,603 so just like we would pass to resolve value right here. 335 335 00:18:27,890 --> 00:18:30,010 Again, the difference is that this one here 336 336 00:18:30,010 --> 00:18:31,893 will resolve immediately. 337 337 00:18:32,850 --> 00:18:34,850 So here, it doesn't matter. 338 338 00:18:34,850 --> 00:18:37,993 So just abc and then we can handle that. 339 339 00:18:41,760 --> 00:18:44,240 And so again, the values here don't matter 340 340 00:18:45,994 --> 00:18:49,317 and then we can also do the same with reject. 341 341 00:18:50,290 --> 00:18:52,763 Let's just duplicate this here actually, 342 342 00:18:54,570 --> 00:18:57,850 so reject and here to den is not necessary 343 343 00:18:57,850 --> 00:19:01,740 because there will be no resolved value anyway. 344 344 00:19:01,740 --> 00:19:04,443 And so we can just catch it like this. 345 345 00:19:07,120 --> 00:19:09,030 And so these two here should now appear 346 346 00:19:09,030 --> 00:19:11,133 at the very beginning. 347 347 00:19:13,190 --> 00:19:14,543 Well, actually they don't. 348 348 00:19:16,890 --> 00:19:20,170 So let's see, Oh, actually here they are. 349 349 00:19:20,170 --> 00:19:23,250 So here is abc and then abc 350 350 00:19:23,250 --> 00:19:25,423 here let's just create a new error. 351 351 00:19:32,770 --> 00:19:36,670 And so indeed here we got a lottery draws happening 352 352 00:19:36,670 --> 00:19:38,713 which comes from the previous promise. 353 353 00:19:43,550 --> 00:19:45,120 Right from here, 354 354 00:19:45,120 --> 00:19:46,440 and so that's because 355 355 00:19:46,440 --> 00:19:50,000 this is basically the first micro task ever. 356 356 00:19:50,000 --> 00:19:52,720 And so therefore this first micro task, 357 357 00:19:52,720 --> 00:19:54,563 it needs to be executed first. 358 358 00:19:56,980 --> 00:19:59,090 And then after this, we have abc 359 359 00:19:59,090 --> 00:20:02,023 and then the problem that we created here in the end. 360 360 00:20:03,550 --> 00:20:06,240 So this is how we built our own promises 361 361 00:20:06,240 --> 00:20:07,750 and how we promisify 362 362 00:20:07,750 --> 00:20:12,470 a very simple callback based asynchronous behavior function 363 363 00:20:12,470 --> 00:20:14,673 such as set timeout. 31087

Can't find what you're looking for?
Get subtitles in any language from opensubtitles.com, and translate them here.