All language subtitles for 20. Returning Values from Async Functions

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,110 --> 00:00:02,230 At this point, 2 2 00:00:02,230 --> 00:00:04,070 we have a pretty good idea 3 3 00:00:04,070 --> 00:00:08,200 of how to work with async/await, right? 4 4 00:00:08,200 --> 00:00:11,260 However, there is one important thing missing. 5 5 00:00:11,260 --> 00:00:14,920 So right now, it might still be a little bit unclear 6 6 00:00:14,920 --> 00:00:19,320 what an async function actually is and how it works. 7 7 00:00:19,320 --> 00:00:21,203 And so let's now fix that. 8 8 00:00:23,010 --> 00:00:25,220 So to understand a bit better, 9 9 00:00:25,220 --> 00:00:27,280 what's actually happening here. 10 10 00:00:27,280 --> 00:00:31,163 Let's start by adding some more console.logs here. 11 11 00:00:33,600 --> 00:00:38,600 So let's say, will get location. 12 12 00:00:38,890 --> 00:00:41,763 And then in the second one here, we will say, 13 13 00:00:45,050 --> 00:00:49,073 finished getting location. 14 14 00:00:50,380 --> 00:00:52,720 And if we check the result here, now, 15 15 00:00:52,720 --> 00:00:55,080 I hope that you already know 16 16 00:00:55,080 --> 00:00:58,370 what the order of the logs here will be. 17 17 00:00:58,370 --> 00:00:59,930 So let's see. 18 18 00:00:59,930 --> 00:01:00,770 And so indeed, 19 19 00:01:00,770 --> 00:01:05,110 immediately we get the first log then the second one. 20 20 00:01:05,110 --> 00:01:07,090 And of course only after that 21 21 00:01:07,090 --> 00:01:10,930 we get all the logs coming from the async function. 22 22 00:01:10,930 --> 00:01:11,800 So again, 23 23 00:01:11,800 --> 00:01:14,350 that's because this is an async function 24 24 00:01:14,350 --> 00:01:16,230 that runs in the background. 25 25 00:01:16,230 --> 00:01:18,770 And so JavaScript immediately moves on 26 26 00:01:18,770 --> 00:01:20,590 to the next line here. 27 27 00:01:20,590 --> 00:01:24,040 Now, if this was indeed a regular function 28 28 00:01:24,040 --> 00:01:27,570 and there would be a console.log in that regular function, 29 29 00:01:27,570 --> 00:01:32,040 then of course, that would appear here between one and two. 30 30 00:01:32,040 --> 00:01:36,170 Right? Well, let's call this three here, actually. 31 31 00:01:36,170 --> 00:01:39,180 So it will then appear between one and three, 32 32 00:01:39,180 --> 00:01:41,850 but in this case it's an async function, 33 33 00:01:41,850 --> 00:01:44,210 and so therefore it runs in the background 34 34 00:01:44,210 --> 00:01:46,053 until the results are there, 35 35 00:01:46,940 --> 00:01:47,773 all right. 36 36 00:01:47,773 --> 00:01:51,050 But now let's say that we wanted to return some data 37 37 00:01:51,050 --> 00:01:53,503 from this function, all right? 38 38 00:01:54,940 --> 00:01:58,513 So let's first get rid of all these console.logs here. 39 39 00:02:01,760 --> 00:02:03,963 Put this all a bit better together. 40 40 00:02:05,370 --> 00:02:09,390 And so here at the end let's now say we wanted to return 41 41 00:02:11,210 --> 00:02:16,210 a string like we had previously based on the geocoding data. 42 42 00:02:18,190 --> 00:02:21,060 So that data is in dataGeo 43 43 00:02:21,060 --> 00:02:23,530 and so let's say you are in 44 44 00:02:27,010 --> 00:02:28,530 dataGeo.city 45 45 00:02:30,820 --> 00:02:33,963 and then just quickly the country here as well. 46 46 00:02:37,240 --> 00:02:39,910 So we return this string here 47 47 00:02:39,910 --> 00:02:42,960 and so let's say we now want to get, 48 48 00:02:42,960 --> 00:02:45,090 of course that data out here. 49 49 00:02:45,090 --> 00:02:46,860 And so for now, let's pretend 50 50 00:02:46,860 --> 00:02:49,940 that this is simply a regular function 51 51 00:02:49,940 --> 00:02:51,693 and then we would do this, 52 52 00:02:53,380 --> 00:02:55,870 we would simply define a variable. 53 53 00:02:55,870 --> 00:02:59,290 Then there, we would store that returned value. 54 54 00:02:59,290 --> 00:03:01,490 And then here, we could take a look at that, 55 55 00:03:02,600 --> 00:03:06,470 but what do you think is going to happen here in this case? 56 56 00:03:06,470 --> 00:03:07,873 Well, let's see. 57 57 00:03:08,800 --> 00:03:12,860 And so the second thing that is logged to the console here 58 58 00:03:12,860 --> 00:03:14,880 is this promise. 59 59 00:03:14,880 --> 00:03:16,500 And remember that back then, 60 60 00:03:16,500 --> 00:03:19,870 when we first started to work with async/await, 61 61 00:03:19,870 --> 00:03:24,380 I told you that an async function always returns a promise. 62 62 00:03:24,380 --> 00:03:27,260 And so here is the proof for that. 63 63 00:03:27,260 --> 00:03:28,930 And if we think about this, 64 64 00:03:28,930 --> 00:03:32,500 then it actually makes sense that here we get a promise 65 65 00:03:32,500 --> 00:03:36,120 and not the value that we would like to get. 66 66 00:03:36,120 --> 00:03:38,223 So the string here, right? 67 67 00:03:39,310 --> 00:03:43,260 The reason for that is that at this point of the code, 68 68 00:03:43,260 --> 00:03:46,160 JavaScript has simply no way of knowing yet 69 69 00:03:46,160 --> 00:03:48,450 there's a string here that we want 70 70 00:03:48,450 --> 00:03:50,660 because the function is still running, 71 71 00:03:50,660 --> 00:03:54,190 but it is also not blocking the code out here. 72 72 00:03:54,190 --> 00:03:57,220 And so therefore again, at this point, 73 73 00:03:57,220 --> 00:03:59,090 JavaScript has no way of knowing 74 74 00:03:59,090 --> 00:04:01,890 what will be returned from this function. 75 75 00:04:01,890 --> 00:04:04,850 And so therefore all that this function does return 76 76 00:04:04,850 --> 00:04:06,670 is a promise. 77 77 00:04:06,670 --> 00:04:10,420 Now the value that we return from an async function, 78 78 00:04:10,420 --> 00:04:12,730 so again, that's this string here 79 79 00:04:12,730 --> 00:04:15,730 will become the fulfilled value of the promise 80 80 00:04:15,730 --> 00:04:18,380 that is returned by the function. 81 81 00:04:18,380 --> 00:04:21,140 And so that's important to understand. 82 82 00:04:21,140 --> 00:04:24,500 So again, this promise that we see down here, 83 83 00:04:24,500 --> 00:04:26,750 the fulfilled value of that promise 84 84 00:04:26,750 --> 00:04:29,270 is going to be this string here, 85 85 00:04:29,270 --> 00:04:31,850 because that is the value that we return 86 86 00:04:31,850 --> 00:04:33,780 from the async function 87 87 00:04:33,780 --> 00:04:36,700 while at least if there is no error here happening 88 88 00:04:36,700 --> 00:04:37,940 in the function, 89 89 00:04:37,940 --> 00:04:41,113 but for now, let's assume the success here again. 90 90 00:04:42,200 --> 00:04:46,400 So since we know that this here will return a promise, 91 91 00:04:46,400 --> 00:04:50,193 we also know how we can actually get the data that we want. 92 92 00:04:51,050 --> 00:04:54,400 So all we need to do instead of this here 93 93 00:04:55,960 --> 00:04:57,773 is simply, whereAmI, 94 94 00:05:00,280 --> 00:05:02,693 let's comment out these two, 95 95 00:05:04,190 --> 00:05:06,053 and so this will be our promise. 96 96 00:05:07,030 --> 00:05:08,680 Then just like before 97 97 00:05:08,680 --> 00:05:12,350 we can use the then method to get the fulfilled value 98 98 00:05:12,350 --> 00:05:13,393 of the promise. 99 99 00:05:14,390 --> 00:05:16,783 Let's call that one city now. 100 100 00:05:20,440 --> 00:05:21,610 All right? 101 101 00:05:21,610 --> 00:05:23,830 So we're using the exact same variable name 102 102 00:05:24,740 --> 00:05:26,210 like we did here, 103 103 00:05:26,210 --> 00:05:28,560 but of course this one here didn't work, 104 104 00:05:28,560 --> 00:05:30,910 but here it is going to work. 105 105 00:05:30,910 --> 00:05:34,290 Because again, in the then handler, 106 106 00:05:34,290 --> 00:05:37,820 this argument that will be passed into the callback function 107 107 00:05:37,820 --> 00:05:41,420 is going to be the result value of the promise. 108 108 00:05:41,420 --> 00:05:43,000 And so one more time, 109 109 00:05:43,000 --> 00:05:45,930 that is this string here that is returned 110 110 00:05:45,930 --> 00:05:48,130 from the async function. 111 111 00:05:48,130 --> 00:05:51,283 And so now let's see what happens. 112 112 00:05:53,330 --> 00:05:55,110 Let's wait for it. 113 113 00:05:55,110 --> 00:06:00,093 Now we get our result, you are in Olhao, Portugal. 114 114 00:06:02,020 --> 00:06:02,970 And so with this, 115 115 00:06:02,970 --> 00:06:06,200 we essentially, successfully returned a value 116 116 00:06:06,200 --> 00:06:07,920 from the function. 117 117 00:06:07,920 --> 00:06:10,580 Now we will be able to do a little bit better, 118 118 00:06:10,580 --> 00:06:13,680 but for now let's think about errors. 119 119 00:06:13,680 --> 00:06:17,820 So if any error occurs here in this try block, 120 120 00:06:17,820 --> 00:06:20,620 then this return here will never be reached 121 121 00:06:20,620 --> 00:06:22,900 because the code will immediately jump 122 122 00:06:22,900 --> 00:06:26,150 here to the catch block, right? 123 123 00:06:26,150 --> 00:06:30,570 So let's just try to create some error here. 124 124 00:06:30,570 --> 00:06:33,240 I will just change this one here, 125 125 00:06:33,240 --> 00:06:35,513 so now nothing will work, 126 126 00:06:37,010 --> 00:06:38,283 so let's wait for it. 127 127 00:06:39,730 --> 00:06:42,533 And so indeed, now we have an error. 128 128 00:06:43,660 --> 00:06:48,563 Now here we get undefined from line five, four, three. 129 129 00:06:49,820 --> 00:06:51,120 That's this one. 130 130 00:06:51,120 --> 00:06:54,840 And so indeed now nothing was returned from the function, 131 131 00:06:54,840 --> 00:06:56,063 we get undefined. 132 132 00:06:57,080 --> 00:07:01,193 Now what's interesting here is that the log still worked. 133 133 00:07:02,350 --> 00:07:03,600 This console.log here, 134 134 00:07:03,600 --> 00:07:07,330 which has now logging undefined here is still running, 135 135 00:07:07,330 --> 00:07:11,390 which means that this callback function is still running, 136 136 00:07:11,390 --> 00:07:14,230 which means that the then method was called, 137 137 00:07:14,230 --> 00:07:17,300 which in turn means that this promise here 138 138 00:07:17,300 --> 00:07:21,380 was actually fulfilled and not rejected. 139 139 00:07:21,380 --> 00:07:25,410 So even though there was an error in the async function, 140 140 00:07:25,410 --> 00:07:27,950 the promise that the async function returns 141 141 00:07:27,950 --> 00:07:32,410 is still fulfilled and not rejected, right? 142 142 00:07:32,410 --> 00:07:35,713 And in fact, if we add a catch handler here, 143 143 00:07:39,890 --> 00:07:41,473 then let's see what happens. 144 144 00:07:43,530 --> 00:07:46,363 So console.error, 145 145 00:07:49,500 --> 00:07:51,513 error.message, 146 146 00:07:52,820 --> 00:07:54,283 then our emoji here. 147 147 00:07:55,490 --> 00:07:57,593 And actually let's add a two here. 148 148 00:07:59,740 --> 00:08:02,303 So the sequence is kind of one, two, three, 149 149 00:08:04,120 --> 00:08:05,513 and let's do the same here. 150 150 00:08:11,470 --> 00:08:12,650 All right? 151 151 00:08:12,650 --> 00:08:16,600 And so we should still get the error from here 152 152 00:08:16,600 --> 00:08:18,360 and indeed we do, 153 153 00:08:18,360 --> 00:08:22,230 but still it is this callback here that is executed. 154 154 00:08:22,230 --> 00:08:27,030 So that's why we get two undefined and not the catch block. 155 155 00:08:27,030 --> 00:08:27,890 And so again, 156 156 00:08:27,890 --> 00:08:30,920 what that means is that even though there was an error 157 157 00:08:30,920 --> 00:08:32,810 in the async function, 158 158 00:08:32,810 --> 00:08:36,250 the promise that it returns is still fulfilled. 159 159 00:08:36,250 --> 00:08:38,840 Now, if we wanted to fix that, 160 160 00:08:38,840 --> 00:08:42,520 if we want to be able to catch that error here as well, 161 161 00:08:42,520 --> 00:08:46,373 then we would have to rethrow that error right here. 162 162 00:08:47,500 --> 00:08:49,760 Rethrowing the error means to basically 163 163 00:08:49,760 --> 00:08:54,380 throw the error again so that we can then propagate it down. 164 164 00:08:54,380 --> 00:08:56,897 And so with that, we will manually reject a promise 165 165 00:08:56,897 --> 00:08:59,473 that's returned from the async function. 166 166 00:09:00,890 --> 00:09:05,890 So let's say reject promise returned from async function. 167 167 00:09:10,210 --> 00:09:14,303 So here we can now take the error and throw it again. 168 168 00:09:15,400 --> 00:09:16,723 So throw error, 169 169 00:09:18,080 --> 00:09:22,980 and so now we get the same error here as we had here. 170 170 00:09:22,980 --> 00:09:26,510 So again, it's, cannot read property flag of undefined 171 171 00:09:26,510 --> 00:09:29,180 and here the same and with this too. 172 172 00:09:29,180 --> 00:09:30,853 So it just coming from here. 173 173 00:09:31,790 --> 00:09:34,830 And so sometimes it's important to do this. 174 174 00:09:34,830 --> 00:09:38,350 And so rethrowing an error is then the correct solution 175 175 00:09:38,350 --> 00:09:41,310 to that problem, all right? 176 176 00:09:41,310 --> 00:09:45,520 And now finally, if we wanted to fix the, not the error, 177 177 00:09:45,520 --> 00:09:49,283 but the fact that the three is printed before the two, 178 178 00:09:50,260 --> 00:09:52,063 well then how would we do that? 179 179 00:09:53,100 --> 00:09:57,500 Well, we can simply add a finally here, right? 180 180 00:09:57,500 --> 00:09:59,970 Because the finally, as you already know, 181 181 00:09:59,970 --> 00:10:03,250 is always gonna be executed. 182 182 00:10:03,250 --> 00:10:04,443 So no matter what, 183 183 00:10:08,550 --> 00:10:09,383 all right? 184 184 00:10:10,720 --> 00:10:12,490 So now we only get the one 185 185 00:10:12,490 --> 00:10:14,960 then we should get the two with the error 186 186 00:10:14,960 --> 00:10:16,260 and then the number three. 187 187 00:10:18,540 --> 00:10:22,083 And indeed, if we remove now the error from here, 188 188 00:10:24,120 --> 00:10:27,783 then one, two, three, just as expected, 189 189 00:10:29,776 --> 00:10:31,130 all right? 190 190 00:10:31,130 --> 00:10:35,230 So I admit that this might've been a little bit confusing, 191 191 00:10:35,230 --> 00:10:37,030 but I hope that you understood 192 192 00:10:37,030 --> 00:10:40,350 how all the pieces fit together here. 193 193 00:10:40,350 --> 00:10:44,010 Now this of course works just fine, but in my opinion, 194 194 00:10:44,010 --> 00:10:46,090 there's still a problem here. 195 195 00:10:46,090 --> 00:10:49,600 And that problem is the fact that doing this here 196 196 00:10:50,600 --> 00:10:53,820 kind of makes this the philosophy of async/await 197 197 00:10:53,820 --> 00:10:58,820 with handling promises using then and catch, right? 198 198 00:10:59,320 --> 00:11:00,850 So we are mixing the old 199 199 00:11:00,850 --> 00:11:03,840 and the new way of working with promises here, 200 200 00:11:03,840 --> 00:11:05,400 all in the same code. 201 201 00:11:05,400 --> 00:11:08,840 And that's something that I personally don't like. 202 202 00:11:08,840 --> 00:11:11,970 So I prefer to always just use async functions 203 203 00:11:11,970 --> 00:11:13,683 instead of having to mix them. 204 204 00:11:14,720 --> 00:11:15,960 And so let's now go ahead 205 205 00:11:15,960 --> 00:11:19,560 and convert this to async/await as well. 206 206 00:11:19,560 --> 00:11:21,920 And we can do that because, of course, 207 207 00:11:21,920 --> 00:11:25,520 we can treat the promise here that has returned 208 208 00:11:25,520 --> 00:11:27,750 just like any other promise. 209 209 00:11:27,750 --> 00:11:30,370 And so of course we are able to handle it 210 210 00:11:30,370 --> 00:11:32,260 using async/await. 211 211 00:11:32,260 --> 00:11:34,840 So that's what we're going to do next. 212 212 00:11:34,840 --> 00:11:38,190 Now it would be great if we could simply use await 213 213 00:11:38,190 --> 00:11:40,590 without the async function, 214 214 00:11:40,590 --> 00:11:44,510 but that doesn't really work, at least for now, 215 215 00:11:44,510 --> 00:11:47,610 because there is actually a proposal in the works 216 216 00:11:47,610 --> 00:11:50,220 to make this happen, but for now, 217 217 00:11:50,220 --> 00:11:54,270 await can only be used inside an async function. 218 218 00:11:54,270 --> 00:11:58,860 However, we don't really want a new complete function here, 219 219 00:11:58,860 --> 00:12:01,950 and so instead we can use an IIFE. 220 220 00:12:01,950 --> 00:12:04,950 So remember IIFEs from way back, 221 221 00:12:04,950 --> 00:12:08,060 they are immediately-invoked function expressions. 222 222 00:12:08,060 --> 00:12:11,393 And remember that this is how we create one. 223 223 00:12:12,860 --> 00:12:14,780 So we write function 224 224 00:12:15,980 --> 00:12:18,330 then here the function body, 225 225 00:12:18,330 --> 00:12:21,200 and then in the end we simply call it. 226 226 00:12:21,200 --> 00:12:24,750 And so of course we can also easily create 227 227 00:12:24,750 --> 00:12:25,583 an async 228 228 00:12:27,038 --> 00:12:28,410 IIFE as well, 229 229 00:12:28,410 --> 00:12:29,460 all right? 230 230 00:12:29,460 --> 00:12:31,990 And actually this pattern here 231 231 00:12:31,990 --> 00:12:36,990 is one of the last remaining cases for IIFEs, all right? 232 232 00:12:37,010 --> 00:12:40,880 And now I actually want to leave the conversion of this 233 233 00:12:40,880 --> 00:12:44,650 to the async function for you as a small challenge. 234 234 00:12:44,650 --> 00:12:46,610 So please pause the video now 235 235 00:12:46,610 --> 00:12:48,430 and take a minute or two 236 236 00:12:48,430 --> 00:12:50,393 and write the code yourself here. 237 237 00:12:51,870 --> 00:12:53,390 All right. 238 238 00:12:53,390 --> 00:12:56,823 So let's start with the try catch block. 239 239 00:12:58,720 --> 00:13:02,940 So try catch, here We get access to the error 240 240 00:13:04,470 --> 00:13:08,233 and then let's actually immediately do this part. 241 241 00:13:11,010 --> 00:13:16,010 And then here we can simply await the whereAmI promise, 242 242 00:13:18,030 --> 00:13:18,890 okay? 243 243 00:13:18,890 --> 00:13:23,020 And then all we have to do is to store that result 244 244 00:13:23,020 --> 00:13:27,453 into the city variable and then log that to the console. 245 245 00:13:29,030 --> 00:13:30,963 So that's just this, 246 246 00:13:32,500 --> 00:13:35,090 and now finally, this last part here, 247 247 00:13:35,090 --> 00:13:39,120 we can simply put it outside of the try catch block. 248 248 00:13:39,120 --> 00:13:42,893 And so then it is always gonna be executed no matter what. 249 249 00:13:44,640 --> 00:13:45,970 Okay? 250 250 00:13:45,970 --> 00:13:47,550 So let's comment this one out 251 251 00:13:48,760 --> 00:13:51,950 and we should get the exact same result 252 252 00:13:51,950 --> 00:13:53,530 and let's wait for it. 253 253 00:13:53,530 --> 00:13:55,080 And here we go. 254 254 00:13:55,080 --> 00:13:58,450 So great. We managed to do the conversion 255 255 00:13:58,450 --> 00:14:02,470 and now everything is using async/await. 256 256 00:14:02,470 --> 00:14:04,570 And so that's much nicer. 257 257 00:14:04,570 --> 00:14:08,590 And now we know how to basically return data 258 258 00:14:08,590 --> 00:14:10,540 from an async function 259 259 00:14:10,540 --> 00:14:14,920 and how to properly receive and handle that returned data. 260 260 00:14:14,920 --> 00:14:16,160 Right? 261 261 00:14:16,160 --> 00:14:18,030 And actually in the real life, 262 262 00:14:18,030 --> 00:14:21,150 this is something that happens all the time. 263 263 00:14:21,150 --> 00:14:23,870 So it's pretty common that we have async functions 264 264 00:14:23,870 --> 00:14:26,190 calling other async functions 265 265 00:14:26,190 --> 00:14:28,740 and returning values between them. 266 266 00:14:28,740 --> 00:14:31,590 And so that's the reason why I'm showing you all this. 267 267 00:14:31,590 --> 00:14:34,550 To make sure that you really correctly understand 268 268 00:14:34,550 --> 00:14:37,433 how async functions work behind the scenes. 22821

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