PROMESAS

PROMESAS

PROMESAS

cuantos estados tiene una promesa?

PROMESAS

  • cumplida
  • incumplida
  • en curso
  • ???

una promesa tiene tres únicos estados:

PROMESAS

una promesa tiene cuatro únicos estados:

  • cumplida
  • incumplida
  • en curso
  • por hacer

PROMESAS

cuando la promesa es un problema, se considera:

  • resuelta
  • rechazada
  • pendiente
  • cumplida
  • incumplida
  • en curso
  • por hacer
  • por hacer

La promesa como recurso narrativo...

La cita

Llamaron quedo, muy quedo,
a la puerta de tu casa...
Villaespesa,

¿has escuchado?

tocan la puerta...
La fiebre te hace

desvariar.

Amado Nervo

Estoy citado con una muerta,
y un día de éstos ha de llamar...
Llevarme pronto me ha prometido;
a su promesa no ha de faltar...
Tocan la puerta. Qué, ¿no has oído?
la fiebre te hace desvariar.

y ahora, también en javascript

100% código nativo

PROMESAS

Una Promise (promesa en castellano) es un objeto que representa la terminación o el fracaso eventual de una operación asíncrona.

  • puede ser creada usando su constructor
  • puede ser devuelta desde una funcion

Las promesas sirven para domesticar funciones asíncronas.

PROMESAS

var myPromise = new Promise(function(resolve, reject) {
      // Esto es solo un ejemplo para crear asincronismo
      window.setTimeout(  function() {
                resolve('promesa finalizada');
        }, Math.random() * 2000 + 1000);

} );

myPromise.then(function (result) {
    console.log(result)
});

PROMESAS

  • se pueden consumir las promesas ya creadas, devueltas desde funciones
var myPromise = function(time) {
    if (!time) time = Math.random() * 2000 + 1000;
    var promise = new Promise((resolve, reject) => {
        if (time > 0) {
            window.setTimeout(function() {
                resolve('myPromise_Finished in ' + time + ' secs');
            }, time);
        } else {
            reject('not a positive integer')
        }
    });
    return promise;
};

myPromise(1000).then((result) => {
    console.log(result);
});

GARANTÍAS

  • Las funciones callback añadidas con .then serán llamadas después del éxito o fracaso de la operación asíncrona, como arriba.
  • Pueden ser añadidas múltiples funciones callback llamando a .then varias veces, para ser ejecutadas independientemente en el orden de inserción.

ENCADENAMIENTO

  • la función then devuelve una promesa nueva,

diferente de la original

EZModelScene.prototype.setBuildingActiveAndGetTexture = function(buildingId, skipSetup) {
    var promise = new Promise((resolve, reject) => {
        if (!skipSetup) {
            skipSetup = false;
        }
        ez3dScene.setActive(buildingId)
            .then(result => {
                ez3dScene.active.getTexture(skipSetup)
                    .then((result) => {
                        resolve({status: 'FINISHED'});
                    })
                    .catch((error) => {
                        reject({status: 'CANCELLED', error: error});
                    })
            })
            .catch((error) => {
                reject({status: 'CANCELLED', error: error});
            });
    });

    return promise;
};

ENCADENAMIENTO

  • then, catch y finally
myPromise
    .then((result) => {
        // do something
    })
    .catch((error) => {
        // do something
    })
    .finally((result) => {
        // do something
    });
myPromise
    .then(exitoCallback, falloCallback);

myPromise
    .catch(falloCallback);

myPromise
    .then(null, falloCallback);
  • catch es un caso particular de then

ENCADENAMIENTO

se pueden encadenar catch y then...

 

new Promise((resolver, rechazar) => {
    console.log('Inicial');

    resolver();
})
.then(() => {
    throw new Error('Algo falló');
        
    console.log('Haz esto');
})
.catch(() => {
    console.log('Haz eso');
})
.then(() => {
    console.log('Haz esto sin que importe lo que sucedió antes');
});

PROPAGACIÓN DE ERRORES

  • el error siempre se propaga hasta el siguiente catch que se encuentre
hazAlgo()
    .then(resultado => hazAlgoMas(valor))
    .then(nuevoResultado => hazLaTerceraCosa(nuevoResultado))
    .then(resultadoFinal => console.log(`Obtenido el resultado final: ${resultadoFinal}`))
    .catch(falloCallback);

PROMESA RECURSIVA

  • ejemplo de promesa recursiva similar al utilizado en getTextures
var divideNumber = function(value) {
    return new Promise((resolve, reject) => {
        value = value / 2;
        console.log(value);
        resolve(value);
    })
    .then((result) => {
        if (result > 1) {
            return divideNumber(result);
        }
        console.log('final result: ' + result)
    })
};

divideNumber(200)

Ejecutar promesas en paralelo

Se puede crear un iterable de promesas para ejecutarlas en lote...

var promisesArray = [myPromise(100), myPromise(3000), myPromise(10000)];

existen dos métodos para ello:

  • Promise.all( [promisesArray] )
  • Promise.race( [promisesArray] )

promise.all

var promisesArray = [myPromise(100), myPromise(3000), myPromise(10000)];

Promise.all(promisesArray)
    .then(result => {
        console.log(result);
    })
    .catch(error => {
        console.log(error)
    });
  • then se ejecuta en cuanto terminan todas las promesas
  • todas las promesas se lanzan a la vez

pero...

promise.race

  • then se ejecuta en cuanto la primera promesa termine
var promisesArray = [myPromise(100), myPromise(3000), myPromise(10000)];

Promise.race(promisesArray)
    .then(result => {
        console.log(result);
    })
    .catch(error => {
        console.log(error)
    });

Ejecutar promesas en serie

Se puede crear un iterable de promesas para ejecutarlas en lote...

var promisesArray = [myPromise(100), myPromise(3000), myPromise(10000)];
var bigPromise = promisesArray.reduce((accumulatorPromise, promise) => {
    return accumulatorPromise.then((result) => {
        return promise;
    });
}, Promise.resolve());
bigPromise
    .then(result => {
        console.log(result);
    })
    .catch(error => {
        console.log(error);
    });

Ejemplos

operadores

deck

By Carlos Padial

deck

  • 102