﻿1
00:00:01,300 --> 00:00:03,370
‫Instructor: Tomemos ahora un minuto para aprender sobre

2
00:00:03,370 --> 00:00:06,370
‫la naturaleza asincrónica de Node. js,

3
00:00:06,370 --> 00:00:09,510
‫que incluye temas absolutamente fundamentales,

4
00:00:09,510 --> 00:00:13,010
‫como código sincrónico, asincrónico, bloqueante

5
00:00:13,010 --> 00:00:15,140
‫y no bloqueante.

6
00:00:15,140 --> 00:00:17,810
‫Y todo esto será realmente importante para

7
00:00:17,810 --> 00:00:21,090
‫comprender todo lo que se presenta a lo largo

8
00:00:21,090 --> 00:00:22,503
‫de esta sección.

9
00:00:24,240 --> 00:00:27,620
‫Entonces, este fragmento de código que escribimos en la

10
00:00:27,620 --> 00:00:31,830
‫última lección, para leer un archivo y luego, guardar su contenido en

11
00:00:31,830 --> 00:00:34,400
‫una variable, fue de una manera llamada

12
00:00:34,400 --> 00:00:36,840
‫síncrona, lo que simplemente significa

13
00:00:36,840 --> 00:00:41,330
‫que cada declaración se procesa básicamente una tras otra, línea nombre del autor.

14
00:00:41,330 --> 00:00:42,540
‫En este ejemplo,

15
00:00:42,540 --> 00:00:45,630
‫primero, se requiere el módulo del sistema de

16
00:00:45,630 --> 00:00:47,630
‫archivos, luego, se lee el

17
00:00:47,630 --> 00:00:50,900
‫archivo y luego, registramos el resultado en la consola.

18
00:00:50,900 --> 00:00:53,340
‫Entonces ves que cada línea

19
00:00:53,340 --> 00:00:57,340
‫de código básicamente espera el resultado de la línea anterior.

20
00:00:57,340 --> 00:00:59,440
‫Ahora, esto puede convertirse en un

21
00:00:59,440 --> 00:01:01,500
‫problema, especialmente con operaciones lentas,

22
00:01:01,500 --> 00:01:04,190
‫porque cada línea bloquea la ejecución del

23
00:01:04,190 --> 00:01:05,710
‫resto del código.

24
00:01:05,710 --> 00:01:08,120
‫Entonces, decimos que el código

25
00:01:08,120 --> 00:01:12,290
‫síncrono también se llama código de bloqueo porque, nuevamente, una

26
00:01:12,290 --> 00:01:15,080
‫determinada operación solo se puede ejecutar después

27
00:01:15,080 --> 00:01:17,740
‫de que la anterior haya terminado.

28
00:01:17,740 --> 00:01:20,850
‫Y debido a la forma en que Node. js fue diseñado,

29
00:01:20,850 --> 00:01:24,220
‫esto se convierte en un gran problema, como veremos

30
00:01:24,220 --> 00:01:26,190
‫en detalle en la siguiente diapositiva.

31
00:01:26,190 --> 00:01:28,500
‫Entonces, la solución a este

32
00:01:28,500 --> 00:01:32,160
‫problema en Node es usar código asincrónico sin bloqueo.

33
00:01:32,160 --> 00:01:35,380
‫Entonces, en código asincrónico, cargamos trabajo pesado

34
00:01:35,380 --> 00:01:38,470
‫para básicamente trabajar en segundo plano.

35
00:01:38,470 --> 00:01:40,820
‫Y luego, una vez que se realiza

36
00:01:40,820 --> 00:01:43,370
‫ese trabajo, se llama a una función de devolución

37
00:01:43,370 --> 00:01:45,730
‫de llamada que registramos antes para manejar el resultado.

38
00:01:45,730 --> 00:01:47,540
‫Y durante todo ese

39
00:01:47,540 --> 00:01:50,380
‫tiempo, el resto del código puede seguir ejecutándose

40
00:01:50,380 --> 00:01:52,910
‫sin ser bloqueado por la tarea

41
00:01:52,910 --> 00:01:55,820
‫pesada, que ahora se ejecuta en segundo plano.

42
00:01:55,820 --> 00:01:59,520
‫Entonces, lo que esto significa es que podemos diferir o

43
00:01:59,520 --> 00:02:01,620
‫reaccionar de manera efectiva en

44
00:02:01,620 --> 00:02:04,530
‫el futuro para que el código no

45
00:02:04,530 --> 00:02:07,676
‫se bloquee y esto, por supuesto, es mucho mejor.

46
00:02:07,676 --> 00:02:09,287
‫¿Tiene sentido?

47
00:02:09,287 --> 00:02:12,203
‫Entonces, en este ejemplo, usamos la

48
00:02:12,203 --> 00:02:16,390
‫función readFile asincrónica, que acepta una función de devolución de llamada.

49
00:02:16,390 --> 00:02:19,120
‫Esto comenzará a leer el archivo en

50
00:02:19,120 --> 00:02:22,360
‫segundo plano y luego, inmediatamente pasará a la siguiente declaración,

51
00:02:22,360 --> 00:02:25,830
‫imprimiendo en la consola el archivo de lectura de cadenas.

52
00:02:25,830 --> 00:02:30,530
‫Entonces, nuevamente, ya ve, no estamos bloqueando la ejecución aquí.

53
00:02:30,530 --> 00:02:33,860
‫Luego, cuando el archivo finalmente se lea por completo, se llamará

54
00:02:33,860 --> 00:02:35,870
‫a la función de devolución de

55
00:02:35,870 --> 00:02:38,100
‫llamada y, por lo tanto, los datos que

56
00:02:38,100 --> 00:02:40,270
‫se leyeron se imprimirán en la consola.

57
00:02:40,270 --> 00:02:41,890
‫Entonces eso es bastante diferente

58
00:02:41,890 --> 00:02:43,893
‫de la versión sincrónica, ¿no es así?

59
00:02:44,870 --> 00:02:46,710
‫Ahora, la pregunta aquí

60
00:02:46,710 --> 00:02:49,490
‫es, ¿por qué tiene que ser así?

61
00:02:49,490 --> 00:02:53,940
‫¿Cuál es el problema con el bloqueo de la ejecución de código en Node. js?

62
00:02:53,940 --> 00:02:57,030
‫O, en otras palabras, ¿por qué usamos la devolución de llamada

63
00:02:57,030 --> 00:02:59,770
‫tantas veces en Node. js?

64
00:02:59,770 --> 00:03:01,523
‫Bueno, averigüémoslo.

65
00:03:03,110 --> 00:03:05,930
‫Y para comprender estas preguntas, lo primero

66
00:03:05,930 --> 00:03:08,220
‫que debemos comprender es el hecho

67
00:03:08,220 --> 00:03:11,260
‫de que Node. js, que

68
00:03:11,260 --> 00:03:13,760
‫es donde se ejecuta nuestra

69
00:03:13,760 --> 00:03:16,410
‫aplicación, solo hay un hilo.

70
00:03:16,410 --> 00:03:19,720
‫Y el hilo es como un conjunto de instrucciones que se

71
00:03:19,720 --> 00:03:22,200
‫ejecutan en la CPU de la computadora.

72
00:03:22,200 --> 00:03:25,200
‫Básicamente, el hilo es donde nuestro

73
00:03:25,200 --> 00:03:29,270
‫código se ejecuta realmente en el procesador de una máquina.

74
00:03:29,270 --> 00:03:33,120
‫Entonces, recuerda, Node. js es básicamente de un

75
00:03:33,120 --> 00:03:36,980
‫solo subproceso y, por lo tanto, para cada aplicación, solo hay un subproceso.

76
00:03:36,980 --> 00:03:40,300
‫Esa es la forma en que Node. js fue diseñado.

77
00:03:40,300 --> 00:03:43,050
‫Ahora, lo que eso significa es que

78
00:03:43,050 --> 00:03:46,960
‫todos los usuarios que acceden a su aplicación están usando el

79
00:03:46,960 --> 00:03:50,040
‫mismo hilo, así que, básicamente, acceden al mismo hilo.

80
00:03:50,040 --> 00:03:53,410
‫Y así, cada vez que interactúan con la aplicación, el

81
00:03:53,410 --> 00:03:55,860
‫código que se ejecuta para cada

82
00:03:55,860 --> 00:03:59,810
‫usuario se ejecutará en el mismo hilo en el mismo lugar

83
00:03:59,810 --> 00:04:02,490
‫en la computadora que ejecuta la aplicación.

84
00:04:02,490 --> 00:04:04,900
‫Y eso es cierto sin importar

85
00:04:04,900 --> 00:04:09,900
‫si tiene cinco usuarios, como en este diagrama, o 5,000 o 5 millones.

86
00:04:10,610 --> 00:04:12,080
‫¿Está bien?

87
00:04:12,080 --> 00:04:15,310
‫Ahora, lo que esto también significa es que cuando

88
00:04:15,310 --> 00:04:17,960
‫un usuario bloquea el hilo único con código

89
00:04:17,960 --> 00:04:19,640
‫síncrono, como acabamos de

90
00:04:19,640 --> 00:04:22,280
‫ver antes, todos los demás usuarios tendrán que

91
00:04:22,280 --> 00:04:24,680
‫esperar a que finalice la ejecución.

92
00:04:24,680 --> 00:04:27,010
‫Y eso podría no ser un

93
00:04:27,010 --> 00:04:29,800
‫gran problema si tiene cinco usuarios, pero

94
00:04:29,800 --> 00:04:33,350
‫definitivamente lo será para miles o incluso millones de

95
00:04:33,350 --> 00:04:35,393
‫usuarios al mismo tiempo.

96
00:04:36,440 --> 00:04:39,830
‫Entonces, imagina que hay un usuario accediendo a tu

97
00:04:39,830 --> 00:04:43,280
‫aplicación y hay un enorme archivo síncrono leído en tu

98
00:04:43,280 --> 00:04:46,630
‫código que tardará como un segundo en cargarse.

99
00:04:46,630 --> 00:04:49,920
‫Esto significará, por supuesto, que durante ese

100
00:04:49,920 --> 00:04:52,370
‫segundo, todos los demás usuarios

101
00:04:52,370 --> 00:04:57,370
‫tendrán que esperar porque toda la ejecución está bloqueada durante ese segundo.

102
00:04:57,490 --> 00:05:00,680
‫Entonces, si esos otros usuarios quieren hacer algunas

103
00:05:00,680 --> 00:05:02,940
‫tareas simples, como iniciar sesión

104
00:05:02,940 --> 00:05:06,900
‫en su aplicación o simplemente solicitar algunos datos, no podrán hacerlo.

105
00:05:06,900 --> 00:05:11,150
‫Tendrán que esperar hasta que el archivo termine de leerse.

106
00:05:11,150 --> 00:05:15,130
‫Solo cuando eso suceda, finalmente podrán realizar las tareas

107
00:05:15,130 --> 00:05:18,113
‫más simples, una tras otra.

108
00:05:19,260 --> 00:05:23,290
‫Ahora, tenga en cuenta que esta es una versión muy simplificada de lo que realmente

109
00:05:23,290 --> 00:05:27,010
‫sucede detrás de escena de Node. js, por lo

110
00:05:27,010 --> 00:05:29,880
‫que volveremos a todo esto en

111
00:05:29,880 --> 00:05:33,760
‫la siguiente sección y obtendremos una comprensión aún

112
00:05:33,760 --> 00:05:38,090
‫más profunda de cómo Node. js maneja el código asincrónico bajo el capó.

113
00:05:38,090 --> 00:05:39,370
‫Pero en este

114
00:05:39,370 --> 00:05:42,170
‫punto, esto es suficiente para que comprenda el concepto.

115
00:05:42,170 --> 00:05:44,560
‫Es mejor ir paso a paso

116
00:05:44,560 --> 00:05:46,520
‫aquí y no hacerlo

117
00:05:46,520 --> 00:05:49,220
‫demasiado confuso desde el principio, ¿de acuerdo?

118
00:05:49,220 --> 00:05:51,660
‫De todos modos, así es como

119
00:05:51,660 --> 00:05:54,620
‫se desarrollaría la situación con el código de

120
00:05:54,620 --> 00:05:58,460
‫bloqueo síncrono, que obviamente es una experiencia terrible para sus usuarios.

121
00:05:58,460 --> 00:06:01,180
‫Por lo tanto, es realmente su trabajo como desarrollador

122
00:06:01,180 --> 00:06:03,260
‫evitar este tipo de situaciones mediante

123
00:06:03,260 --> 00:06:05,113
‫el uso de código asincrónico.

124
00:06:07,150 --> 00:06:10,180
‫Entonces, para la misma situación, deberíamos, por supuesto, usar

125
00:06:10,180 --> 00:06:12,780
‫la función de lectura de archivo asincrónica, que

126
00:06:12,780 --> 00:06:15,190
‫en lugar de bloquear el

127
00:06:15,190 --> 00:06:17,700
‫hilo único, hace el trabajo pesado en

128
00:06:17,700 --> 00:06:20,170
‫segundo plano, donde básicamente permanece hasta que

129
00:06:20,170 --> 00:06:22,700
‫termina de leer los datos del archivo.

130
00:06:22,700 --> 00:06:25,950
‫Por supuesto, también registramos una función de devolución de

131
00:06:25,950 --> 00:06:29,490
‫llamada que se llamará una vez que los datos estén disponibles.

132
00:06:29,490 --> 00:06:32,130
‫Y en este escenario, todos los demás

133
00:06:32,130 --> 00:06:35,100
‫usuarios pueden realizar sus tareas en un solo

134
00:06:35,100 --> 00:06:38,710
‫hilo, uno tras otro, mientras el archivo todavía se está

135
00:06:38,710 --> 00:06:40,390
‫leyendo en segundo plano.

136
00:06:40,390 --> 00:06:43,870
‫Ahora, una vez que se leen los datos, nuestra función de

137
00:06:43,870 --> 00:06:46,240
‫devolución de llamada, por supuesto, se

138
00:06:46,240 --> 00:06:51,240
‫llamará para que se ejecute en el hilo principal único para procesar los datos leídos.

139
00:06:51,380 --> 00:06:52,460
‫Y eso es.

140
00:06:52,460 --> 00:06:54,720
‫Esa es una descripción general de cómo Node. js maneja

141
00:06:54,720 --> 00:06:58,000
‫el comportamiento asincrónico para implementar el modelo de E

142
00:06:58,000 --> 00:07:00,850
‫/ S sin bloqueo del que hablamos

143
00:07:00,850 --> 00:07:03,670
‫en la lección de introducción, ¿de acuerdo?

144
00:07:03,670 --> 00:07:07,240
‫Y E / S simplemente significa entrada-salida, que

145
00:07:07,240 --> 00:07:10,810
‫es básicamente cosas como acceder al sistema de

146
00:07:10,810 --> 00:07:13,500
‫archivos y manejar solicitudes de red.

147
00:07:13,500 --> 00:07:16,470
‫En realidad, esta es la razón por la que Node. js está completamente

148
00:07:16,470 --> 00:07:18,830
‫diseñado en torno a devoluciones de llamada,

149
00:07:18,830 --> 00:07:21,190
‫como verá a lo largo del curso.

150
00:07:21,190 --> 00:07:24,090
‫En otros lenguajes de programación, como PHP, funciona

151
00:07:24,090 --> 00:07:27,260
‫de manera muy diferente porque obtienes, básicamente, un hilo

152
00:07:27,260 --> 00:07:29,640
‫nuevo para cada nuevo usuario, lo

153
00:07:29,640 --> 00:07:32,020
‫cual es un paradigma completamente diferente

154
00:07:32,020 --> 00:07:34,600
‫y realmente funciona de manera completamente diferente.

155
00:07:34,600 --> 00:07:37,620
‫Pero el creador de Node. js encontró que

156
00:07:37,620 --> 00:07:40,660
‫este modelo es la mejor solución para crear

157
00:07:40,660 --> 00:07:42,980
‫aplicaciones web escalables y de alto rendimiento.

158
00:07:42,980 --> 00:07:46,810
‫Ahora, solo como nota final aquí, es importante saber que,

159
00:07:46,810 --> 00:07:48,830
‫cuando usamos devoluciones de

160
00:07:48,830 --> 00:07:53,380
‫llamada en nuestro código, eso no lo hace automáticamente asíncrono, ¿de acuerdo?

161
00:07:53,380 --> 00:07:56,520
‫Entonces, pasar funciones a otras funciones

162
00:07:56,520 --> 00:07:58,780
‫es bastante común en

163
00:07:58,780 --> 00:08:01,830
‫JavaScript, pero por supuesto, nuevamente, eso

164
00:08:01,830 --> 00:08:05,110
‫no las hace asincrónicas automáticamente, ¿de acuerdo?

165
00:08:05,110 --> 00:08:09,150
‫Solo funciona de esta manera para algunas funciones en la API de nodo,

166
00:08:09,150 --> 00:08:11,210
‫como la función readFile y muchas,

167
00:08:11,210 --> 00:08:14,823
‫muchas más, a medida que la gente explore en el futuro.

168
00:08:16,610 --> 00:08:18,500
‫Y ahora, solo para terminar,

169
00:08:18,500 --> 00:08:21,200
‫ya que estamos hablando de código asincrónico aquí,

170
00:08:21,200 --> 00:08:24,630
‫solo una última nota sobre las funciones de devolución de llamada.

171
00:08:24,630 --> 00:08:27,670
‫Entonces, este modelo de devolución de llamada que acabamos

172
00:08:27,670 --> 00:08:29,370
‫de discutir, donde se

173
00:08:29,370 --> 00:08:32,300
‫llama a una función una vez que la anterior

174
00:08:32,300 --> 00:08:36,970
‫ha terminado su trabajo, puede llevar rápidamente a un código difícil de leer e inmanejable.

175
00:08:36,970 --> 00:08:39,830
‫Solo tome este ejemplo donde el segundo archivo

176
00:08:39,830 --> 00:08:41,870
‫leído depende del primero,

177
00:08:41,870 --> 00:08:44,800
‫luego, el tercer archivo leído depende del segundo

178
00:08:44,800 --> 00:08:47,560
‫y, finalmente, queremos usar los datos finales

179
00:08:47,560 --> 00:08:49,700
‫para escribir un archivo como resultado.

180
00:08:49,700 --> 00:08:52,690
‫Eso parece bastante confuso, ¿verdad?

181
00:08:52,690 --> 00:08:54,950
‫Quiero decir, va a funcionar

182
00:08:54,950 --> 00:08:57,330
‫bien, pero es difícil razonar y

183
00:08:57,330 --> 00:09:00,110
‫eso es solo con cuatro niveles de profundidad.

184
00:09:00,110 --> 00:09:02,980
‫Imagina que tienes como 10 o 20 niveles,

185
00:09:02,980 --> 00:09:05,850
‫que en realidad no es tan infrecuente.

186
00:09:05,850 --> 00:09:09,440
‫De todos modos, esto es lo que llamamos el infierno de devolución de llamada.

187
00:09:09,440 --> 00:09:11,370
‫Es un problema tan

188
00:09:11,370 --> 00:09:13,780
‫común que ya tiene su propio nombre.

189
00:09:13,780 --> 00:09:16,920
‫¿Y notas esta forma triangular aquí?

190
00:09:16,920 --> 00:09:20,840
‫Esa es una señal muy clara de que estás en el infierno de las devoluciones de llamada.

191
00:09:20,840 --> 00:09:24,350
‫Ahora, ¿cómo podemos escapar del infierno de devolución de llamada?

192
00:09:24,350 --> 00:09:27,600
‫Bueno, podemos usar herramientas más avanzadas para

193
00:09:27,600 --> 00:09:30,730
‫manejar código asincrónico, como ES6 promises

194
00:09:30,730 --> 00:09:34,150
‫o incluso mejor, ES8 async / await.

195
00:09:34,150 --> 00:09:36,320
‫Ahora, el modelo del que acabamos de

196
00:09:36,320 --> 00:09:37,890
‫hablar seguirá siendo el mismo.

197
00:09:37,890 --> 00:09:39,960
‫Simplemente tenemos formas más

198
00:09:39,960 --> 00:09:43,370
‫elegantes de manejar el código en sí y escribirlo.

199
00:09:43,370 --> 00:09:45,830
‫Y hay toda una sección opcional

200
00:09:45,830 --> 00:09:50,090
‫más adelante en el curso sobre promesas y también, async / await, en

201
00:09:50,090 --> 00:09:52,590
‫caso de que no esté familiarizado con ellas.

202
00:09:52,590 --> 00:09:55,140
‫Pero por ahora, seguiremos usando devoluciones de

203
00:09:55,140 --> 00:09:57,900
‫llamada porque eso es lo que Node usó

204
00:09:57,900 --> 00:10:00,100
‫originalmente y fue diseñado alrededor.

205
00:10:00,100 --> 00:10:02,030
‫Y ahora, dicho esto,

206
00:10:02,030 --> 00:10:05,240
‫sigamos adelante y usemos este modelo asincrónico en

207
00:10:05,240 --> 00:10:07,233
‫la práctica por primera vez.

