Promesas en Node.js.

    Introducci贸n

    JavaScript es de un solo hilo, lo que significa que todo, incluidos los eventos, se ejecuta en el mismo hilo. Si el hilo no est谩 libre, la ejecuci贸n del c贸digo se retrasa hasta que lo est茅. Esto puede ser un cuello de botella para nuestra aplicaci贸n, ya que puede crear serios problemas de rendimiento.

    Hay varias formas en las que podemos superar esta limitaci贸n. En este art铆culo, exploraremos la forma moderna de manejar tareas asincr贸nicas en JavaScript: Promises.

    Devuelve las llamadas y el infierno devuelve las llamadas

    Si es un desarrollador de JavaScript, probablemente haya o铆do hablar de las llamadas, si no se utilizan:

    function hello() {
        console.log('Hello World!');
    }
    
    setTimeout(hello, 5000);
    

    Este c贸digo tiene una funci贸n, setTimeout(), que permanece durante el per铆odo especificado (en milisegundos), pasado como segundo argumento, 5000. Pasado el tiempo, simplemente ejecuta la funci贸n hello, se le pasa como primer par谩metro.

    La funci贸n es un ejemplo de una funci贸n de orden superior y se recupera la funci贸n que se le transfiere, una funci贸n que debe realizarse despu茅s de que se complete otra funci贸n.

    Supongamos que enviamos una aplicaci贸n a la API para devolver las fotos que m谩s me gustan a nuestra cuenta. Es posible que tengamos que esperar la respuesta, ya que la API o el servicio pueden estar haciendo algunos c谩lculos antes de devolver la respuesta.

    Esto puede llevar mucho tiempo y no queremos congelar el hilo mientras esperamos la respuesta. En su lugar, crearemos un retiro que se notificar谩 cuando llegue la respuesta.

    Hasta entonces, se est谩 ejecutando el resto del c贸digo, como presentar publicaciones y anuncios.

    Si alguna vez ha trabajado con la devoluci贸n de llamada, es probable que haya visto un infierno de devoluci贸n de llamada:

    doSomething(function(x) {
        console.log(x);
        doSomethingMore(x, function(y) {
            console.log(y);
            doRestOfTheThings(y, function(z) {
                console.log(z);
            });
        });
    });
    

    Imagine una situaci贸n en la que le pedimos al servidor que obtenga varios recursos: una persona, sus amigos y las publicaciones de sus amigos, los comentarios en las publicaciones de cada amigo, las respuestas, etc.

    La gesti贸n de estas dependencias anidadas puede salirse de control r谩pidamente.

    Podemos evitar el infierno de devoluci贸n de llamadas y manejar llamadas asincr贸nicas usando Promises.

    Creando un compromiso

    Promises, como su nombre lo indica, la funci贸n de “dar una palabra” es devolver un valor m谩s tarde. Es un proxy de un valor que no se puede devolver, a menos que la funci贸n de la que esperamos una respuesta.

    En lugar de devolver valores concretos, estas funciones asincr贸nicas devuelven un Promise objeto, que se cumplir谩 en alg煤n momento o no.

    A menudo, cuando codificamos, usamos Promises en lugar de crearlos. Son las bibliotecas / marcos los que crean Promises para que los clientes coman.

    A煤n as铆, lo bueno est谩 detr谩s de la creaci贸n de un Promise:

    let promise = new Promise(function(resolve, reject) {
        // Some imaginary 2000 ms timeout simulating a db call
        setTimeout(()=> {
            if (/* if promise can be fulfilled */) {
                resolve({msg: 'It works', data: 'some data'});
            } else {
                // If promise can not be fulfilled due to some errors like network failure
                reject(new Error({msg: 'It does not work'}));
            }
        }, 2000);
    });
    

    El constructor de la promesa tiene un argumento: un retiro. La devoluci贸n de llamada puede ser una funci贸n normal o una funci贸n de flecha. La recuperaci贸n toma dos par谩metros: resolve y reject. Ambos son referencias de funciones. La revocatoria tambi茅n se denomina albacea.

    El ejecutor se ejecuta inmediatamente cuando se crea una promesa. La promesa se resuelve con una llamada. resolve() si la promesa se cumple y se rechaza por llamada reject() si no se puede cumplir.

    Ambos resolve() y reject() un argumento asume – boolean, string, number, array, o la object.

    Consumo de compromiso

    A trav茅s de API, digamos que hemos solicitado algunos datos del servidor y no estamos seguros de cu谩ndo se devolver谩n, 驴se devolver谩n en absoluto? Este es un ejemplo perfecto de cuando usamos un Promise Para ayudarnos.

    Suponiendo que el modo de servidor que maneja nuestra llamada devuelve un Promise, podemos comerlo:

    promise.then((result) => {
        console.log("Success", result);
    }).catch((error) => {
        console.log("Error", error);
    })
    

    Como vemos, tenemos dos m茅todos con una cadena: then() y catch(). No hay muchos de estos m茅todos diferentes proporcionados por el Promise objeto.

    then() ejecutar cuando las cosas vayan bien, es decir, que el resolve() m茅todo. Y si la promesa fue rechazada, el catch() el m茅todo referido como el error enviado a reject.

    Compromisos encadenados

    Si tenemos una secuencia de tareas asincr贸nicas, una tras otra, que es necesario realizar, cuanto m谩s incrustada est谩, m谩s pesado se vuelve el c贸digo.

    Eso nos lleva a ser llamados infierno, que se puede evitar f谩cilmente encadenando algunos then() m茅todos en individuo Promised resultado:

    promise.then(function(result) {
        // Register user
        return {account: 'blahblahblah'};
    }).then(function(result) {
        // Auto login
        return {session: 'sjhgssgsg16775vhg765'};
    }).then(function(result) {
        // Present WhatsNew and some options
        return {whatsnew: {}, options: {}};
    }).then(function(result) {
        // Remember the user Choices
        return {msg: 'All done'};
    });
    

    Como vemos, el resultado se pone a trav茅s de una cadena. then() manipuladores:

    • El frente promise resuelve objeto
    • Entonces la then() Se llama a un controlador para registrar un usuario
    • El valor que devuelve se env铆a al siguiente valor. then() controlador para registrar autom谩ticamente al usuario
    • … y as铆

    Tambi茅n el then(handler) puede crear y devolver una promesa.

    Nota: Si bien t茅cnicamente podemos hacer algo como el ejemplo en el futuro, puede desviarse del punto de encadenamiento. Si bien esta t茅cnica puede ser buena cuando necesita llamar selectivamente m茅todos asincr贸nicos:

    let promise = new Promise(function(resolve, reject) {
        setTimeout(() => resolve({msg: 'To do some more job'}), 1000);
    });
    
    promise.then(function(result) {
        return {data: 'some data'};
    });
    
    promise.then(function(result) {
        return {data: 'some other data'};
    });
    
    promise.then(function(result) {
        return {data: 'some more data'};
    });
    

    Todo lo que estamos haciendo aqu铆 es agregar algunos controladores a un compromiso, y todos ellos hacen lo result independientemente. No se est谩n dando el resultado en la secuencia.

    De esta manera, todos los manejadores reciben el mismo resultado, el resultado de esa promesa. {msg: 'To do some more job'}.

    Conclusi贸n

    Promises, como su nombre lo indica, la funci贸n de “dar una palabra” es devolver un valor en un momento posterior. Es un proxy de un valor que no se puede devolver, a menos que la funci贸n de la que esperamos una respuesta.

    En lugar de devolver valores concretos, estas funciones asincr贸nicas devuelven un Promise objeto, que se cumplir谩 en alg煤n momento o no.

    Si ha trabajado con llamadas de devoluci贸n de llamada, debe respetar una sem谩ntica limpia y clara. Promises.

    Como desarrollador de nodes / JavaScript, nos ocuparemos de las promesas con m谩s frecuencia. Despu茅s de todo, es un mundo asincr贸nico, lleno de maravillas.

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *