‫Instructor: En este video, prometeremos
‫las funciones de archivo de lectura y escritura.
‫Lo que significa que los haremos para
‫que devuelvan promesas en
‫lugar de pasarles funciones de devolución de llamada.
‫Entonces, si lo desea, es básicamente una función de archivo de
‫lectura que devuelve una promesa
‫y que solo recibe un nombre de archivo, sin devolución de llamada.
‫Así que hagamos exactamente eso.
‫Entonces, vamos a crear una función pro de lectura de archivos.
‫Así que a favor de la promesa porque
‫nuevamente devuelve una promesa.
‫Y luego todo lo que hacemos es
‫pasar el nombre del archivo y, como decíamos, devolver una promesa.
‫Entonces, devuelva una nueva promesa.
‫Entonces usamos el constructor de promesas
‫aquí que se introdujo en el lenguaje con ES6.
‫Entonces, antes de ES6 como ES5, ES4
‫y todas las
‫versiones anteriores, no había soporte para promesas en JavaScript.
‫Pero cambiaron eso en
‫ES6 y mejoraron mucho el lenguaje en ese sentido.
‫Por lo que respecta a JavaScript asincrónico.
‫Ahora, este constructor de promesas
‫aquí toma una llamada función ejecutora, que
‫se llamará inmediatamente cuando se cree la promesa.
‫Y esta función tomará dos argumentos, así que
‫resuelva y rechace.
‫Así que resuelvan y rechacen,
‫pero por ahora no se preocupen por
‫ellos, hablaremos de ellos en un minuto.
‫Por ahora, centrémonos en esta función ejecutora en sí
‫misma porque aquí es donde realmente hacemos
‫todo este trabajo asincrónico.
‫En este caso, el archivo de lectura funciona.
‫Así que aquí es donde llamaremos fs. readfile con el
‫nombre del archivo que se pasó
‫y luego la función de devolución de llamada habitual, está bien.
‫Entonces, el error y los datos,
‫como antes.
‫Así que tenga en cuenta
‫que en realidad no estamos cambiando la función de
‫archivo de lectura, simplemente estamos creando
‫una nueva función que, detrás de escena, por supuesto, todavía ejecuta
‫la función de archivo de lectura incorporada, pero luego devuelve
‫una promesa para que podamos usar
‫la promesa en su
‫lugar. de la función de devolución de llamada.
‫Bueno.
‫Así que aquí tenemos esa función de lectura
‫de archivo que hará
‫su trabajo y cuando esté lista volverá con los datos.
‫Y ahora aquí es donde
‫entran en juego las funciones de resolución y rechazo.
‫Porque ambos argumentos que están
‫disponibles en la función ejecutora son funciones.
‫Ahora, llamar a la
‫función de resolución marcará básicamente la promesa como exitosa
‫y cumplida,
‫y devolverá el valor exitoso de la promesa.
‫Así que hagámoslo de verdad.
‫Por eso lo llamamos resolver con datos.
‫Entonces, cualquier variable que pasemos a la función de resolución
‫es lo que estará disponible
‫más adelante como argumento en el método then, ¿de acuerdo?
‫Entonces, estos datos aquí serán el
‫valor que nos devuelva esta promesa, está bien.
‫Eso probablemente suena un poco confuso, ¿verdad?
‫Entonces, nuevamente, lo que sea que pasemos a esta función aquí, a
‫la función de resolución,
‫es el resultado de la
‫promesa que estará disponible en el controlador then.
‫Ahora, por otro
‫lado, también podemos marcar la promesa como rechazada en caso
‫de que haya un error, está bien.
‫Y lo hacemos llamando,
‫como probablemente
‫pueda adivinar, a la función de rechazo.
‫Entonces, si hubo un error y
‫esto es similar a lo que hicimos antes.
‫Entonces, si hubo un error
‫aquí, llame a la función de rechazo.
‫Y todo lo que pasemos a este
‫será el error que luego
‫estará disponible en el método de captura.
‫Entonces, en este de aquí.
‫¿Okey?
‫Así que pasemos una cadena
‫aquí, no pude encontrar ese archivo, algunos emoji aquí tal vez
‫para que aparezca un poco más en
‫nuestra consola. registros, ¿de acuerdo?
‫Y esta bien.
‫Eso ya es todo.
‫Entonces, repasemos esto aquí nuevamente.
‫Entonces creamos un nuevo
‫archivo, allí pasaremos un nombre de archivo.
‫Entonces este argumento.
‫Y todo lo que hacemos aquí es devolver esta promesa.
‫Esta promesa incluye una función ejecutora, así que
‫esta aquí,
‫que es donde hacemos nuestro trabajo asincrónico.
‫En ese caso aquí, por supuesto, es nuestro
‫fs. readfile.
‫Luego, si obtenemos nuestros datos correctamente, llamamos a
‫la función de
‫resolución con el valor de resolución.
‫Y si hay un
‫error, llamamos a la función de rechazo, ¿de acuerdo?
‫Y ahora vamos a usar esto en la práctica.
‫Read file pro, pasamos nuestro
‫nombre de archivo.
‫Así que ese es este, por
‫supuesto, y eso es todo.
‫Entonces esto ahora devolverá una promesa.
‫Y así, al igual
‫que antes, podemos usar nuestro método then en eso.
‫De acuerdo, este argumento de datos aquí será exactamente
‫lo que devolvimos de la promesa en caso
‫de que tuviera éxito.
‫Entonces, con esta determinación.
‫Entonces, en este momento, nuestro archivo
‫de perro aquí contiene
‫labrador y, por lo tanto, estos datos aquí serán labrador.
‫Y eso está disponible más adelante en
‫nuestro controlador de entonces aquí.
‫Pero, por supuesto, no necesita tener el mismo nombre,
‫también podría llamarlo como resultado
‫o algo que no importe, ¿de acuerdo?
‫Bien, ahora tomemos todo esto y
‫pongámoslo aquí.
‫Bueno.
‫Deshazte de todo esto, guárdalo y
‫eso lo ejecutará.
‫Ahora tenemos ese error aquí, por lo
‫que los datos no están definidos.
‫Eso es porque lo cambié aquí a un resultado.
‫Así que regresemos y cambiemos a datos porque aquí
‫tenemos datos y aquí
‫tenemos datos
‫y de esta manera no tengo que
‫seguir adelante y cambiar todos estos nombres de variables.
‫Dale otra salvada y
‫aquí vamos.
‫Así que funcionó, ¿ves?
‫De hecho, obtuvimos la raza,
‫que todavía es
‫labrador y esta vez de nuestra promesa, está bien.
‫Entonces, esto realmente funcionó.
‫Entonces, nuestra función read file
‫pro ahora devuelve
‫una promesa y esos datos aquí están disponibles en nuestro controlador de entonces.
‫Genial, ya está funcionando y
‫podemos mejorarlo mucho y
‫lo
‫haremos, pero por ahora también quiero prometer
‫esta función de escritura de archivo aquí.
‫Básicamente, hagamos lo mismo que
‫hicimos con la función de lectura de archivos.
‫Ahora, si ya sabe un poco acerca
‫de no js, tal vez esté pensando que en realidad hay
‫un nodo de función que nos promete funciones automáticamente.
‫Pero, por supuesto, quería mostrarles aquí
‫cómo funcionan realmente las promesas
‫y cómo las
‫construimos, por eso es que estoy haciendo todo esto aquí, está bien.
‫Así que realmente quiero que aprendas sobre las promesas,
‫no solo cómo las consumimos,
‫sino también cómo construirlas.
‫Y por eso lo hago de esta manera.
‫Entonces, escriba el archivo y como una promesa.
‫Y este en realidad no solo necesita el nombre
‫del archivo, sino también los datos que deben escribirse en ese archivo.
‫Pero entonces la lógica aquí es bastante similar.
‫Entonces, nuevamente, devolvemos una nueva promesa,
‫allí tenemos nuestra función
‫ejecutora que toma resolver y rechazar como argumento.
‫Y estos son
‫nombres estándar. Resuélvalos y
‫rechácelos. Podrías llamarlos como realmente quisieras,
‫pero este es el estándar, está bien.
‫Entonces fs,
‫escribe el
‫archivo, pasamos el archivo, los
‫datos y luego la función de devolución de llamada.
‫Y ahora algo muy similar a antes, así
‫que si hubo un
‫error, entonces llame a la función de rechazo
‫y pase algún mensaje allí.
‫No se pudo escribir
‫el archivo, nuevamente con este emoji aquí para que se destaque
‫un poco más y en caso de que
‫todo funcione bien, entonces resuélvalo.
‫Ahora no tenemos ningún dato para pasar aquí, ¿verdad?
‫Así que vamos a pasar una cadena
‫aleatoria, algo como decir éxito, está bien.
‫Por lo tanto, una
‫promesa no siempre tiene que devolver un valor significativo.
‫En este caso, todo lo que realmente
‫estamos tratando de
‫hacer aquí es escribir un archivo que realmente no devuelva un valor significativo.
‫Así que ahora estamos listos para usar esta función prometida,
‫pero
‫antes de hacerlo, implementemos el encadenamiento
‫del que les hablé antes.
‫Entonces, en
‫este momento, todavía tenemos devoluciones de llamada dentro de devoluciones de
‫llamada dentro de devoluciones de llamada, ¿verdad?
‫Entonces tenemos esto, que
‫tiene esta devolución de llamada.
‫Y luego hay otro controlador que
‫tiene otra devolución de llamada.
‫Entonces eso realmente no cambia nada, ¿verdad?
‫En su lugar, queremos encadenar estos controladores aquí.
‫Y el secreto para
‫hacer eso es hacer que cada controlador devuelva una nueva promesa.
‫Entonces, ¿cómo vamos a hacer eso?
‫Bueno, recuerde que esta función aquí devuelve una promesa.
‫Entonces, todo lo que tenemos
‫que hacer es devolver esa promesa de este primero y luego manejador.
‫Déjame mostrarte eso.
‫Entonces decimos volver superagente. get y luego
‫la cadena y eso ahora es una promesa, está bien.
‫Y luego cerramos esta función de devolución
‫de llamada aquí y encadenamos este método directamente a ella.
‫Salvarlo, ahora tenemos algún error aquí y eso
‫está en la línea 40.
‫Deshagámonos de esto aquí y
‫está bien.
‫Cambió el formato aquí para
‫nosotros nuevamente, que
‫era más bonito y luego ya lo tenemos funcionando aquí.
‫Entonces, ¿por qué funciona esto de nuevo?
‫Bueno, por supuesto, esta función que creamos
‫al principio devuelve una promesa.
‫Entonces, podemos usar el método then.
‫Luego hacemos que esta función de devolución de llamada que
‫está en ella nuevamente devuelva una promesa.
‫Y así podemos
‫encadenar al siguiente controlador en eso.
‫Entonces, esta variable de
‫resultado aquí será el valor resuelto de
‫esta promesa que regresó del controlador anterior, ¿de acuerdo?
‫¿Tiene sentido?
‫Ahora, para dar un paso más,
‫seguiremos adelante
‫y usaremos nuestra función de escritura de archivos pro aquí ahora también.
‫Y como queremos seguir encadenando los métodos
‫then, lo devolveremos de nuevo.
‫Así que regrese, escriba file pro pass en el
‫nombre del archivo, que es este, los
‫datos ...
‫Y eso es todo.
‫Bien, ya no necesitamos nada de esto aquí,
‫solo comentémoslo por ahora.
‫Deshazte de este espacio
‫aquí y luego allá podemos encadenar el siguiente controlador.
‫Entonces, y recuerde que
‫aquí en realidad no teníamos ningún valor resuelto significativo.
‫Entonces, no queremos ningún argumento
‫para esta función de devolución de
‫llamada aquí, todo lo que queremos hacer es registrar esta cadena, ¿verdad?
‫Así que ahora realmente podemos deshacernos de
‫esto y está bien.
‫Entonces, aquí abajo vemos ahora
‫que en realidad ya está funcionando.
‫Y nuevamente, el truco para
‫poder encadenar todos estos métodos aquí es devolver
‫una promesa antes de llamar a cada uno de ellos.
‫Así que este aquí obviamente devuelve una promesa aquí para
‫que podamos encadenar el método then en él.
‫Entonces este fragmento de
‫código aquí
‫devolverá una promesa y entonces podemos usarlo.
‫Entonces este fragmento de código
‫devolverá una promesa y entonces podremos usarlo de nuevo, ¿de acuerdo?
‫Así que ese es el secreto.
‫Vuelve a salvarlo
‫y aquí abajo vemos que la raza sigue siendo labrador.
‫Vemos que esto aquí es el enlace, vayamos
‫aquí y confirmemos que esto es
‫realmente lo mismo que esto.
‫Y así escribió con éxito la cadena en el archivo de texto
‫usando nuestra función de archivo de escritura promisificada, de acuerdo.
‫Y luego, al final, tenemos este controlador de errores.
‫Y la belleza aquí es que para todas estas cadenas
‫y luego manipuladores
‫al final, simplemente necesitamos un solo manipulador de capturas.
‫Entonces, una función que maneja
‫los errores provenientes de cualquiera de las tres promesas, está bien.
‫De hecho, solo registremos el error en la
‫consola e intentemos, por
‫ejemplo, cambiar este archivo aquí.
‫En realidad no es
‫el archivo, pero voy a cambiar el nombre del archivo
‫aquí, guardarlo y ahora vemos que no pude encontrar ese archivo.
‫Entonces, ¿de dónde viene eso?
‫Viene aquí desde
‫llamar a la función de rechazo, ¿de acuerdo?
‫Tenemos un error aquí porque no pudimos encontrar el archivo
‫y llamamos a la función de rechazo.
‫Y esa función de rechazo marcará esta promesa aquí, así que recuerde
‫que esta es una promesa.
‫Lo marcará como rechazado.
‫Y por lo tanto, se llama a la función de captura.
‫Y entonces registramos ese error en la consola.
‫Y el resultado de eso es lo que puedes ver aquí abajo.
‫Bien, volvamos a ponerlo ahora que
‫funciona.
‫Ahora vayamos al archivo, creemos un
‫perro que no existe y
‫ahora, oh, aquí tenemos este gran error extraño y eso es porque simplemente
‫estamos registrando el error completo y no el mensaje
‫de error como lo estábamos haciendo antes, pero no
‫no importa.
‫Ahora dale un guardado aquí
‫ahora, devuélvelo
‫y está bien.
‫Así que ahora todo está
‫funcionando y nos deshicimos de esa forma
‫triangular que teníamos
‫en nuestro código y ahora tenemos una estructura plana de promesas en cadena.
‫Nuevamente, esto es mucho más
‫fácil de administrar y espero que puedas comenzar
‫a apreciarlo y también es más lógico
‫pensar y razonar sobre el código de esta manera.
‫Ahora, en
‫la próxima lección, daremos un paso más
‫y lo haremos aún más legible
‫y más fácil de usar.
‫Así que estad atentos a eso.