SlideShare uma empresa Scribd logo
1 de 41
Concurrency
with
Promise Style
Rayco Araña
Software Engineer at Tuenti
rayco@tuenti.com
¿De qué vamos a hablar?
• El patrón Promise
• Promesas vs Listeners
• Paralelizar sin morir en el intento
• Algo de reactive programming… o no
Usando listeners…
public class FileManager {
public void read(File jsonFile, OnFileReadListener listener) {
...
}
}
Usando listeners…
public void foo() {
FileManager fileManager = ...; //Initialize
fileManager.read(new File("config.json"), new OnFileReadListener() {
public void onFileRead(JSONObject jsonFile) {
...
}
public void onError(Exception ex) {
...
}
});
}
Usando listeners…
Problemas…
• Sincronizar múltiples llamadas?
Problemas…
• Sincronizar múltiples llamadas?
• Implementación síncrona?
Problemas…
• La pila de ejecución queda contaminada
public class CacheFileManager implements FileManager {
private Cache cache;
public void read(File jsonFile, OnFileReadListener listener) {
JSONObject object = cache.get(jsonFile);
if(object != null) {
listener.onFileRead(object);
} else {
...
}
}
}
Problemas…
• Sincronizar múltiples llamadas?
• Implementación síncrona?
• En qué hilo se ejecuta el Listener?
Problemas…
• Sincronizar múltiples llamadas?
• Implementación síncrona?
• En qué hilo se ejecuta el Listener?
• Es esto “clean code”?
Problemas…
Output arguments are counterintuitive. Readers expect
arguments to be inputs, not outputs. If your function must
change the state of something, have it change the state of the
object it is called on.
Robert C. Martin
Promise style…
public void foo() {
FileManager fileManager = ...; //Initialize
Promise promise = fileManager.read(new File("config.json"));
}
public class FileManager {
public Promise read(File jsonFile) {
...
}
}
Patrón Promise
Objeto que hace de proxy con el resultado
de una operación
El resultado suele ser desconocido debido a que su cálculo aún no ha
acabado
Patrón Promise. Características
• Código más legible
• Concurrencia más sencilla
• Tests más sencillos
• Sin ArgumentCaptors para capturar callbacks que luego estimular.
jDeferred
• Implementación Java del patrón Promise
• Inspirado en Deferred Object de jQuery
• Soporte específico para Android
• Código muy compacto con Lambdas en Java 8
• http://jdeferred.org
jDeferred. Claves
• Promise : interface
• Promesa que recibes al realizar una operación.
• DeferredObject : class
• Objeto con el que controlas el estado de la promesa
• AndroidDeferredObject
• DeferredManager : interface
• Gestor de promesas
• DefaultDeferredManager implementación por defecto
• AndroidDefererdManager
jDeferred. Flujo
Hilo 2
create
Cliente API DeferredObject
init
attachCallbacks
resolve()
executeCallbacks
read()
• Vamos a implementar una API sencilla
jDeferred. Caso práctico I
public class FileManager {
public Promise<JSONObject, Exception, Void> read(File jsonFile) {
...
}
}
• Creamos un DeferredObject
• Realizamos la operación en background
• Devolvemos la promesa
jDeferred. Caso práctico II
public Promise<JSONObject, Exception, Void> read(File jsonFile) {
DeferredObject<JSONObject, Exception, Void> deferredObject = new DeferredObject<>();
doReadAsync(jsonFile, deferredObject);
return deferredObject.promise();
}
• El trabajo lo dejamos para que lo ejecute un ThreadPool
jDeferred. Caso práctico III
private Executor threadPool = Executors.newSingleThreadExecutor(); //Whatever thread pool
private void doReadAsync(File jsonFile,
DeferredObject<JSONObject, Exception, Void> deferredObject) {
threadPool.execute(new Runnable() {
@Override
public void run() {
doTryRead(jsonFile, deferredObject);
}
});
}
• Tratamos el caso de error e implementamos la lógica
jDeferred. Caso práctico IV
private void doTryRead(File jsonFile,
DeferredObject<JSONObject, Exception, Void> deferredObject) {
try {
deferredObject.resolve(doRead(jsonFile));
} catch (Exception ex) {
deferredObject.reject(ex);
}
}
private JSONObject doRead(File jsonFile) throws IOException, ParseException {
JSONObject jsonObject = ...; //Read the file
return jsonObject;
}
• Usando la API que hemos creado
jDeferred. Caso práctico V
FileManager fileManager = new FileManager();
fileManager.read(new File("config.json"))
.done(new DoneCallback<JSONObject>() {
@Override
public void onDone(JSONObject result) {
config.init(result);
view.showMessage("Config loaded.");
}
}).fail(new FailCallback<Exception>() {
@Override
public void onFail(Exception ex) {
config.initWithDefaults();
view.showMessage("Default config loaded.");
}
});
• Con Java 8 queda aún más compacto
jDeferred. Caso práctico V
FileManager fileManager = new FileManager();
fileManager.read(new File("config.json"))
.done((result) -> {
config.init(result);
view.showMessage("Config loaded.");
}).fail((ex) -> {
config.initWithDefaults();
view.showMessage("Default config loaded.");
});
jDeferred. Caso práctico VI
• Mocking de forma sencilla
private void givenSomeValidConfigFile() {
FileManager fileManager = mock(FileManager.class);
JSONObject jsonObject = ...//Create the mock config
DeferredObject<JSONObject, Exception, Void> deferredObject = new DeferredObject<>();
when(fileManager.read(any(File.class))).thenReturn(deferredObject.resolve(jsonObject));
}
Flexibilidad
• Implementación síncrona de la API muy sencilla
private Cache cache = new Cache(); //Some cache
private FileManager networkFileManager = new NetworkFileManager();
public Promise<JSONObject, Exception, Void> read(File jsonFile) {
JSONObject jsonObject = cache.get(jsonFile);
if (jsonObject != null) {
return new DeferredObject().resolve(jsonObject);
} else {
return networkFileManager.read(jsonFile); //Delegate
}
}
• ¿En qué hilo se ejecuta el Listener? ¿UI o Background?
• UI
• Cosas en el hilo de UI que no queremos
• Background
• Cuando queremos hacer algo en UI tenemos que recurrir a Handlers
• Problema subyacente
• Responsabilidad recae en la API: Bad idea 
• Es el cliente de la API quien debe decidir esto
Listeners en Android
• AndroidDeferredObject
• Wrapper de DeferredObject para añadir soporte para Android
• Nuevos callbacks
• AndroidDoneCallback
• AndroidFailCallback
• AndroidProgressCallback
• AndroidAlwaysCallback
• Método para elegir en que hilo se va a ejecutar
• A partir de 1.2.5, se puede indicar con una anotación
jDeferred en Android
jDeferred en Android
• Consejo: Crear clases abstractas que oculten el método
public abstract class UIDoneCallback implements AndroidDoneCallback {
public AndroidExecutionScope getExecutionScope() {
return AndroidExecutionScope.UI;
}
}
public abstract class BackgroundDoneCallback implements AndroidDoneCallback {
public AndroidExecutionScope getExecutionScope() {
return AndroidExecutionScope.BACKGROUND;
}
}
jDeferred en Android
• Adios Handlers!
FileManager fileManager = new FileManager();
fileManager.read(new File("config.json"))
.done(new BackgroundDoneCallback<JSONObject>() {
@Override
public void onDone(JSONObject result) {
config.init(result);
}
}).done(new UIDoneCallback<JSONObject>() {
@Override
public void onDone(JSONObject result) {
view.showMessage("Config loaded.");
}
});
• CPUs con muchos cores
• Algunos se apagan, pero hay un consumo mínimo
• Usar todos de forma eficiente permite apagar la CPU antes
• Un ThreadPool no es suficiente
• Nos ayuda a lanzar trabajos en paralelo
• ¿Cómo sincronizar trabajos dependientes entre si?
• Herramientas de bajo nivel… complicadas de depurar.
Paralelizar trabajo
• DeferredManager. Permite lanzar y/o sincronizar promesas
• Devuelve otra promesa
Paralelizar trabajo
DeferredManager deferredManager = new DefaultDeferredManager();
Promise configPromise = fileManager.read(new File("config.json"));
Promise serverPromise = fileManager.read(new File("server.json"));
Promise userPromise = fileManager.read(new File("user.json"));
deferredManager.when(configPromise, serverPromise, userPromise)
.done(new DoneCallback<MultipleResults>() {
@Override
public void onDone(MultipleResults results) {
for (OneResult result : results) {
view.showJSON((JSONObject) result.getResult());
}
view.showMessage("All files loaded!");
}
});
Filters
• Nos permiten manipular o transformar una promesa
deferredManager.when(configPromise, serverPromise, userPromise)
.then(new DoneFilter<MultipleResults, Config>() {
@Override
public Config filterDone(MultipleResults results) {
JSONObject config = (JSONObject) results.get(0).getResult();
JSONObject server = (JSONObject) results.get(1).getResult();
JSONObject user = (JSONObject) results.get(2).getResult();
return new Config(config, server, user);
}
})
.done(result -> view.showConfig(result))
.fail(ex -> view.showMessage("Config not loaded :-("));
Filters
• Se puede aplicar a cualquier tipo de promesa
fileManager.read(new File("config.json"))
.then(new DoneFilter<JSONObject, Config>() {
@Override
public Config filterDone(JSONObject result) {
return new Config(result);
}
})
.done(result -> view.showConfig(result))
.fail(ex -> view.showMessage("Config not loaded :-("));
Pipes
• Más potente que los filtros
• Transformar con posibilidad de errores
fileManager.read(new File("config.json"))
.then(new DonePipe<JSONObject, Config, Exception, Void>() {
@Override
public Promise<Config, Exception, Void> pipeDone(JSONObject result) {
DeferredObject<Config, Exception, Void> deferred = new DeferredObject<>();
if (Config.isValid(result)) {
return deferred.resolve(new Config(result));
} else {
return deferred.reject(new IllegalConfigException());
}
}
})
.done(result -> view.showConfig(result))
.fail(ex -> view.showMessage("Config not loaded :-("));
Pipes
• Pero también encadenar operaciones
fileManager.read(new File("user/server.json"))
.then(new DonePipe<JSONObject, JSONObject, Exception, Void>() {
@Override
public Promise<JSONObject, Exception, Void> pipeDone(JSONObject result) {
Server server = new Server(result);
return fileManager.read(server.getConfigPath());
}
})
.done(result -> view.showConfig(result))
.fail(ex -> view.showMessage("User config not loaded :-("));
…
jDeferred no es RxJava
• Promesas tienen estado
• No se puede reutilizar
• Solo se puede llamar 1 vez a resolve() o reject()
• A notify() si podemos llamar muchas veces
• Para progreso, no para notificar cambios
• Ni mejor ni peor, depende de nuestros requisitos.
The end!
We are hiring!
• ¿Quieres unirte a nosotros?
• Buscas un ambiente creativo
• Grandes desafíos
• Desarrollar productos que cambien
la vida de millones de personas
Envíanos tu CV!
Tuenti challenge 5
¿Preguntas?
• jDeferred
• http://jdeferred.org
• Mi blog personal
• http://raycoarana.com
• Tuenti Developers Blog
• http://corporate.tuenti.com/es/dev/blog
Rayco Araña
Software Engineer at Tuenti
@raycoarana
rayco@tuenti.com

Mais conteúdo relacionado

Mais procurados

Evadiendo antivirus - uso de crypters
Evadiendo antivirus - uso de cryptersEvadiendo antivirus - uso de crypters
Evadiendo antivirus - uso de cryptersINCIDE
 
Construccion de proyectos con gradle
Construccion de proyectos con gradleConstruccion de proyectos con gradle
Construccion de proyectos con gradleDavid Gómez García
 
Jsp directiva page
Jsp directiva pageJsp directiva page
Jsp directiva pagejubacalo
 
Acceso a BBDD mediante un servlet
Acceso a BBDD mediante un servletAcceso a BBDD mediante un servlet
Acceso a BBDD mediante un servletjubacalo
 
Servlet Hola Mundo con Eclipse y Tomcat
Servlet Hola Mundo con Eclipse y TomcatServlet Hola Mundo con Eclipse y Tomcat
Servlet Hola Mundo con Eclipse y Tomcatjubacalo
 
EJB con Eclipse y JBoss
EJB con Eclipse y JBossEJB con Eclipse y JBoss
EJB con Eclipse y JBossPaco Garat
 
12.android servicios web
12.android   servicios web12.android   servicios web
12.android servicios webguidotic
 
Creacion y Administracion de servicios usando Docker - .Net Conf Mx 2018
Creacion y Administracion de servicios usando Docker - .Net Conf Mx 2018Creacion y Administracion de servicios usando Docker - .Net Conf Mx 2018
Creacion y Administracion de servicios usando Docker - .Net Conf Mx 2018Vicente Gerardo Guzman Lucio
 
Elementos de script en JSP
Elementos de script en JSPElementos de script en JSP
Elementos de script en JSPjubacalo
 
Un ejemplo sencillo con ejb
Un ejemplo sencillo con ejbUn ejemplo sencillo con ejb
Un ejemplo sencillo con ejblalov777
 

Mais procurados (14)

Evadiendo antivirus - uso de crypters
Evadiendo antivirus - uso de cryptersEvadiendo antivirus - uso de crypters
Evadiendo antivirus - uso de crypters
 
Construccion de proyectos con gradle
Construccion de proyectos con gradleConstruccion de proyectos con gradle
Construccion de proyectos con gradle
 
Jsp directiva page
Jsp directiva pageJsp directiva page
Jsp directiva page
 
Acceso a BBDD mediante un servlet
Acceso a BBDD mediante un servletAcceso a BBDD mediante un servlet
Acceso a BBDD mediante un servlet
 
Servlet Hola Mundo con Eclipse y Tomcat
Servlet Hola Mundo con Eclipse y TomcatServlet Hola Mundo con Eclipse y Tomcat
Servlet Hola Mundo con Eclipse y Tomcat
 
Tomcat yant
Tomcat yantTomcat yant
Tomcat yant
 
EJB con Eclipse y JBoss
EJB con Eclipse y JBossEJB con Eclipse y JBoss
EJB con Eclipse y JBoss
 
12.android servicios web
12.android   servicios web12.android   servicios web
12.android servicios web
 
TALLER 2 COMANDOS PLSQL
TALLER 2 COMANDOS PLSQLTALLER 2 COMANDOS PLSQL
TALLER 2 COMANDOS PLSQL
 
Creacion y Administracion de servicios usando Docker - .Net Conf Mx 2018
Creacion y Administracion de servicios usando Docker - .Net Conf Mx 2018Creacion y Administracion de servicios usando Docker - .Net Conf Mx 2018
Creacion y Administracion de servicios usando Docker - .Net Conf Mx 2018
 
Volley vs Retrofit
Volley vs RetrofitVolley vs Retrofit
Volley vs Retrofit
 
Elementos de script en JSP
Elementos de script en JSPElementos de script en JSP
Elementos de script en JSP
 
Un ejemplo sencillo con ejb
Un ejemplo sencillo con ejbUn ejemplo sencillo con ejb
Un ejemplo sencillo con ejb
 
Gestionando servidores con Puppet
Gestionando servidores con PuppetGestionando servidores con Puppet
Gestionando servidores con Puppet
 

Destaque

RENEWABLE ENERGY SOURCES BY ROHAN AND ANU....
RENEWABLE ENERGY SOURCES BY ROHAN AND ANU....RENEWABLE ENERGY SOURCES BY ROHAN AND ANU....
RENEWABLE ENERGY SOURCES BY ROHAN AND ANU....Rohan Jadhav
 
Ultimate global presentation la presentacion
Ultimate global  presentation la presentacionUltimate global  presentation la presentacion
Ultimate global presentation la presentacionDavid Garnik
 
EL TRABAJO CIENTÍFICO ESTUDIANTIL: VÍA PARA LA EDUCACIÓN DE VALORES EN LAS UN...
EL TRABAJO CIENTÍFICO ESTUDIANTIL: VÍA PARA LA EDUCACIÓN DE VALORES EN LAS UN...EL TRABAJO CIENTÍFICO ESTUDIANTIL: VÍA PARA LA EDUCACIÓN DE VALORES EN LAS UN...
EL TRABAJO CIENTÍFICO ESTUDIANTIL: VÍA PARA LA EDUCACIÓN DE VALORES EN LAS UN...Violeta Rodríguez
 
Evidencias de humedad - Karina y Anabella
Evidencias de humedad - Karina y AnabellaEvidencias de humedad - Karina y Anabella
Evidencias de humedad - Karina y AnabellaKarina Rosario
 
Tutoriales de c
Tutoriales de cTutoriales de c
Tutoriales de celidetjc
 
INSIGHTS OKTOBER 2014
INSIGHTS OKTOBER 2014INSIGHTS OKTOBER 2014
INSIGHTS OKTOBER 2014Brainagency
 
Pedro damian pinacho lujan 1 o
Pedro damian pinacho lujan 1 oPedro damian pinacho lujan 1 o
Pedro damian pinacho lujan 1 opattas
 
Pat7.2 ความถนัดทางภาษาเยอรมัน
Pat7.2 ความถนัดทางภาษาเยอรมันPat7.2 ความถนัดทางภาษาเยอรมัน
Pat7.2 ความถนัดทางภาษาเยอรมันTheyok Tanya
 
200119265 rfek-reglamento-categorias-inferiores-2014
200119265 rfek-reglamento-categorias-inferiores-2014200119265 rfek-reglamento-categorias-inferiores-2014
200119265 rfek-reglamento-categorias-inferiores-2014elmunu
 
DOP AN CAMINI_Tedesco
DOP AN CAMINI_TedescoDOP AN CAMINI_Tedesco
DOP AN CAMINI_TedescoAN Camini
 
loop für die Energiewirtschaft
loop für die Energiewirtschaftloop für die Energiewirtschaft
loop für die EnergiewirtschaftREDTREE GmbH
 
Desarrollo del currículo e innovación
Desarrollo del currículo e innovaciónDesarrollo del currículo e innovación
Desarrollo del currículo e innovaciónJazmin Vazquez Miranda
 
nuances Energieeffizienz-Newsletter, 03. März 2015
nuances Energieeffizienz-Newsletter, 03. März 2015nuances Energieeffizienz-Newsletter, 03. März 2015
nuances Energieeffizienz-Newsletter, 03. März 2015nuances
 

Destaque (20)

HSP Tingkatan 5
HSP Tingkatan 5HSP Tingkatan 5
HSP Tingkatan 5
 
RENEWABLE ENERGY SOURCES BY ROHAN AND ANU....
RENEWABLE ENERGY SOURCES BY ROHAN AND ANU....RENEWABLE ENERGY SOURCES BY ROHAN AND ANU....
RENEWABLE ENERGY SOURCES BY ROHAN AND ANU....
 
Ultimate global presentation la presentacion
Ultimate global  presentation la presentacionUltimate global  presentation la presentacion
Ultimate global presentation la presentacion
 
EL TRABAJO CIENTÍFICO ESTUDIANTIL: VÍA PARA LA EDUCACIÓN DE VALORES EN LAS UN...
EL TRABAJO CIENTÍFICO ESTUDIANTIL: VÍA PARA LA EDUCACIÓN DE VALORES EN LAS UN...EL TRABAJO CIENTÍFICO ESTUDIANTIL: VÍA PARA LA EDUCACIÓN DE VALORES EN LAS UN...
EL TRABAJO CIENTÍFICO ESTUDIANTIL: VÍA PARA LA EDUCACIÓN DE VALORES EN LAS UN...
 
Evidencias de humedad - Karina y Anabella
Evidencias de humedad - Karina y AnabellaEvidencias de humedad - Karina y Anabella
Evidencias de humedad - Karina y Anabella
 
Medidas de posición
Medidas de posición Medidas de posición
Medidas de posición
 
Tutoriales de c
Tutoriales de cTutoriales de c
Tutoriales de c
 
INSIGHTS OKTOBER 2014
INSIGHTS OKTOBER 2014INSIGHTS OKTOBER 2014
INSIGHTS OKTOBER 2014
 
Trabajo exel
Trabajo exelTrabajo exel
Trabajo exel
 
CIBV TRAVIESITOS FELICES
CIBV TRAVIESITOS FELICES CIBV TRAVIESITOS FELICES
CIBV TRAVIESITOS FELICES
 
Socialnest
SocialnestSocialnest
Socialnest
 
Pedro damian pinacho lujan 1 o
Pedro damian pinacho lujan 1 oPedro damian pinacho lujan 1 o
Pedro damian pinacho lujan 1 o
 
Pat7.2 ความถนัดทางภาษาเยอรมัน
Pat7.2 ความถนัดทางภาษาเยอรมันPat7.2 ความถนัดทางภาษาเยอรมัน
Pat7.2 ความถนัดทางภาษาเยอรมัน
 
200119265 rfek-reglamento-categorias-inferiores-2014
200119265 rfek-reglamento-categorias-inferiores-2014200119265 rfek-reglamento-categorias-inferiores-2014
200119265 rfek-reglamento-categorias-inferiores-2014
 
MMWP_Rendering PP
MMWP_Rendering PPMMWP_Rendering PP
MMWP_Rendering PP
 
DOP AN CAMINI_Tedesco
DOP AN CAMINI_TedescoDOP AN CAMINI_Tedesco
DOP AN CAMINI_Tedesco
 
loop für die Energiewirtschaft
loop für die Energiewirtschaftloop für die Energiewirtschaft
loop für die Energiewirtschaft
 
Century21
Century21Century21
Century21
 
Desarrollo del currículo e innovación
Desarrollo del currículo e innovaciónDesarrollo del currículo e innovación
Desarrollo del currículo e innovación
 
nuances Energieeffizienz-Newsletter, 03. März 2015
nuances Energieeffizienz-Newsletter, 03. März 2015nuances Energieeffizienz-Newsletter, 03. März 2015
nuances Energieeffizienz-Newsletter, 03. März 2015
 

Semelhante a Concurrency with Promise Style – Rayco Araña

Un poco más allá con grails. PrimerViernes
Un poco más allá con grails. PrimerViernesUn poco más allá con grails. PrimerViernes
Un poco más allá con grails. PrimerViernesDani Latorre
 
Persistencia en Java - Serialización
Persistencia en Java - SerializaciónPersistencia en Java - Serialización
Persistencia en Java - SerializaciónCarlos Hernando
 
HackDay Java 9 Spanish version
HackDay Java 9 Spanish versionHackDay Java 9 Spanish version
HackDay Java 9 Spanish versionHillmerC
 
Curso de Desarrollo Web 2
Curso de Desarrollo Web 2Curso de Desarrollo Web 2
Curso de Desarrollo Web 2juliocombativo
 
Magallanes, Herramienta de despliegue PHP sencilla y poderosa
Magallanes, Herramienta de despliegue PHP sencilla y poderosa�Magallanes, Herramienta de despliegue PHP sencilla y poderosa�
Magallanes, Herramienta de despliegue PHP sencilla y poderosaFco Javier Núñez Berrocoso
 
La magia de jquery
La magia de jqueryLa magia de jquery
La magia de jqueryAngelDX
 
Prueba De Aplicaciones Web con Selenium 2 y WebDriver
Prueba De Aplicaciones Web con Selenium 2 y WebDriverPrueba De Aplicaciones Web con Selenium 2 y WebDriver
Prueba De Aplicaciones Web con Selenium 2 y WebDriverDavid Gómez García
 
Seminario jquery, html5 y wicket
Seminario jquery, html5 y wicketSeminario jquery, html5 y wicket
Seminario jquery, html5 y wicketAdrià Solé Orrit
 
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAPARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAVíctor Bolinches
 
Iron workers y javascript
Iron workers y javascriptIron workers y javascript
Iron workers y javascriptJavier Constain
 
Symfony en Drupal 8 - DrupalCamp Spain
Symfony en Drupal 8 - DrupalCamp Spain Symfony en Drupal 8 - DrupalCamp Spain
Symfony en Drupal 8 - DrupalCamp Spain Raul Fraile
 

Semelhante a Concurrency with Promise Style – Rayco Araña (20)

Un poco más allá con grails. PrimerViernes
Un poco más allá con grails. PrimerViernesUn poco más allá con grails. PrimerViernes
Un poco más allá con grails. PrimerViernes
 
main.pdf
main.pdfmain.pdf
main.pdf
 
Persistencia en Java - Serialización
Persistencia en Java - SerializaciónPersistencia en Java - Serialización
Persistencia en Java - Serialización
 
JRuby al Rescate de J2EE
JRuby al Rescate de J2EEJRuby al Rescate de J2EE
JRuby al Rescate de J2EE
 
Microservicios con Quarkus
Microservicios con QuarkusMicroservicios con Quarkus
Microservicios con Quarkus
 
Concurrencia en Java
Concurrencia en Java Concurrencia en Java
Concurrencia en Java
 
HackDay Java 9 Spanish version
HackDay Java 9 Spanish versionHackDay Java 9 Spanish version
HackDay Java 9 Spanish version
 
Javascript OOP
Javascript OOPJavascript OOP
Javascript OOP
 
JRuby Al Rescate J2EE
JRuby Al Rescate J2EEJRuby Al Rescate J2EE
JRuby Al Rescate J2EE
 
Curso de Desarrollo Web 2
Curso de Desarrollo Web 2Curso de Desarrollo Web 2
Curso de Desarrollo Web 2
 
Magallanes, Herramienta de despliegue PHP sencilla y poderosa
Magallanes, Herramienta de despliegue PHP sencilla y poderosa�Magallanes, Herramienta de despliegue PHP sencilla y poderosa�
Magallanes, Herramienta de despliegue PHP sencilla y poderosa
 
La magia de jquery
La magia de jqueryLa magia de jquery
La magia de jquery
 
Prueba De Aplicaciones Web con Selenium 2 y WebDriver
Prueba De Aplicaciones Web con Selenium 2 y WebDriverPrueba De Aplicaciones Web con Selenium 2 y WebDriver
Prueba De Aplicaciones Web con Selenium 2 y WebDriver
 
OSGi
OSGiOSGi
OSGi
 
19 javascript servidor
19 javascript servidor19 javascript servidor
19 javascript servidor
 
Seminario jquery, html5 y wicket
Seminario jquery, html5 y wicketSeminario jquery, html5 y wicket
Seminario jquery, html5 y wicket
 
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAPARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
 
Iron workers y javascript
Iron workers y javascriptIron workers y javascript
Iron workers y javascript
 
Partesdeeclipse
PartesdeeclipsePartesdeeclipse
Partesdeeclipse
 
Symfony en Drupal 8 - DrupalCamp Spain
Symfony en Drupal 8 - DrupalCamp Spain Symfony en Drupal 8 - DrupalCamp Spain
Symfony en Drupal 8 - DrupalCamp Spain
 

Mais de Droidcon Spain

Android: más allÁpp – inMedia Studio
Android: más allÁpp – inMedia StudioAndroid: más allÁpp – inMedia Studio
Android: más allÁpp – inMedia StudioDroidcon Spain
 
Me enamoré de un robot - Tecnilogica
Me enamoré de un robot - TecnilogicaMe enamoré de un robot - Tecnilogica
Me enamoré de un robot - TecnilogicaDroidcon Spain
 
Apps and cars - Applicantes
Apps and cars - ApplicantesApps and cars - Applicantes
Apps and cars - ApplicantesDroidcon Spain
 
Accesibilidad en apps móviles - Codefactory
Accesibilidad en apps móviles - CodefactoryAccesibilidad en apps móviles - Codefactory
Accesibilidad en apps móviles - CodefactoryDroidcon Spain
 
Visión Artificial, Accesibilidad y Android
Visión Artificial, Accesibilidad y AndroidVisión Artificial, Accesibilidad y Android
Visión Artificial, Accesibilidad y AndroidDroidcon Spain
 
Desvelando el GDK - Droidcon Spain
Desvelando el GDK - Droidcon SpainDesvelando el GDK - Droidcon Spain
Desvelando el GDK - Droidcon SpainDroidcon Spain
 
Monetize your idea! - Pay Pal
Monetize your idea! - Pay PalMonetize your idea! - Pay Pal
Monetize your idea! - Pay PalDroidcon Spain
 
Desarrollo ágil de apps con Genexus
Desarrollo ágil de apps con GenexusDesarrollo ágil de apps con Genexus
Desarrollo ágil de apps con GenexusDroidcon Spain
 
Metodología Scrum para el desarrollo de apps
Metodología Scrum para el desarrollo de appsMetodología Scrum para el desarrollo de apps
Metodología Scrum para el desarrollo de appsDroidcon Spain
 
Introducción Tu Go and Open Tok - Telefónica i+d
Introducción Tu Go and Open Tok - Telefónica i+d Introducción Tu Go and Open Tok - Telefónica i+d
Introducción Tu Go and Open Tok - Telefónica i+d Droidcon Spain
 
Open tok Android sdk - Droidcon
Open tok Android sdk - DroidconOpen tok Android sdk - Droidcon
Open tok Android sdk - DroidconDroidcon Spain
 
Ui testing with espresso
Ui testing with espressoUi testing with espresso
Ui testing with espressoDroidcon Spain
 
Geolocalización en Android
Geolocalización en Android Geolocalización en Android
Geolocalización en Android Droidcon Spain
 
Cordova 3, apps para android
Cordova 3, apps para androidCordova 3, apps para android
Cordova 3, apps para androidDroidcon Spain
 
Programación Reactiva en Android
Programación Reactiva en AndroidProgramación Reactiva en Android
Programación Reactiva en AndroidDroidcon Spain
 
Requisitos de Accesibilidad
Requisitos de AccesibilidadRequisitos de Accesibilidad
Requisitos de AccesibilidadDroidcon Spain
 
Presentación Accesibilidad ASPACENET
Presentación Accesibilidad ASPACENETPresentación Accesibilidad ASPACENET
Presentación Accesibilidad ASPACENETDroidcon Spain
 
Droid con Aspace-Cross
Droid con Aspace-CrossDroid con Aspace-Cross
Droid con Aspace-CrossDroidcon Spain
 
Android UI design trends
Android UI design trendsAndroid UI design trends
Android UI design trendsDroidcon Spain
 

Mais de Droidcon Spain (20)

Android: más allÁpp – inMedia Studio
Android: más allÁpp – inMedia StudioAndroid: más allÁpp – inMedia Studio
Android: más allÁpp – inMedia Studio
 
Me enamoré de un robot - Tecnilogica
Me enamoré de un robot - TecnilogicaMe enamoré de un robot - Tecnilogica
Me enamoré de un robot - Tecnilogica
 
Apps and cars - Applicantes
Apps and cars - ApplicantesApps and cars - Applicantes
Apps and cars - Applicantes
 
Accesibilidad en apps móviles - Codefactory
Accesibilidad en apps móviles - CodefactoryAccesibilidad en apps móviles - Codefactory
Accesibilidad en apps móviles - Codefactory
 
Visión Artificial, Accesibilidad y Android
Visión Artificial, Accesibilidad y AndroidVisión Artificial, Accesibilidad y Android
Visión Artificial, Accesibilidad y Android
 
Desvelando el GDK - Droidcon Spain
Desvelando el GDK - Droidcon SpainDesvelando el GDK - Droidcon Spain
Desvelando el GDK - Droidcon Spain
 
Monetize your idea! - Pay Pal
Monetize your idea! - Pay PalMonetize your idea! - Pay Pal
Monetize your idea! - Pay Pal
 
Desarrollo ágil de apps con Genexus
Desarrollo ágil de apps con GenexusDesarrollo ágil de apps con Genexus
Desarrollo ágil de apps con Genexus
 
Metodología Scrum para el desarrollo de apps
Metodología Scrum para el desarrollo de appsMetodología Scrum para el desarrollo de apps
Metodología Scrum para el desarrollo de apps
 
Introducción Tu Go and Open Tok - Telefónica i+d
Introducción Tu Go and Open Tok - Telefónica i+d Introducción Tu Go and Open Tok - Telefónica i+d
Introducción Tu Go and Open Tok - Telefónica i+d
 
Tu go - Droidcon
Tu go - DroidconTu go - Droidcon
Tu go - Droidcon
 
Open tok Android sdk - Droidcon
Open tok Android sdk - DroidconOpen tok Android sdk - Droidcon
Open tok Android sdk - Droidcon
 
Ui testing with espresso
Ui testing with espressoUi testing with espresso
Ui testing with espresso
 
Geolocalización en Android
Geolocalización en Android Geolocalización en Android
Geolocalización en Android
 
Cordova 3, apps para android
Cordova 3, apps para androidCordova 3, apps para android
Cordova 3, apps para android
 
Programación Reactiva en Android
Programación Reactiva en AndroidProgramación Reactiva en Android
Programación Reactiva en Android
 
Requisitos de Accesibilidad
Requisitos de AccesibilidadRequisitos de Accesibilidad
Requisitos de Accesibilidad
 
Presentación Accesibilidad ASPACENET
Presentación Accesibilidad ASPACENETPresentación Accesibilidad ASPACENET
Presentación Accesibilidad ASPACENET
 
Droid con Aspace-Cross
Droid con Aspace-CrossDroid con Aspace-Cross
Droid con Aspace-Cross
 
Android UI design trends
Android UI design trendsAndroid UI design trends
Android UI design trends
 

Último

POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...silviayucra2
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITMaricarmen Sánchez Ruiz
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)GDGSucre
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíassuserf18419
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIAWilbisVega
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudianteAndreaHuertas24
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxLolaBunny11
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx241521559
 
Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfJulian Lamprea
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfsoporteupcology
 

Último (13)

POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptx
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
 
Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdf
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdf
 

Concurrency with Promise Style – Rayco Araña

  • 1. Concurrency with Promise Style Rayco Araña Software Engineer at Tuenti rayco@tuenti.com
  • 2. ¿De qué vamos a hablar? • El patrón Promise • Promesas vs Listeners • Paralelizar sin morir en el intento • Algo de reactive programming… o no
  • 3. Usando listeners… public class FileManager { public void read(File jsonFile, OnFileReadListener listener) { ... } }
  • 4. Usando listeners… public void foo() { FileManager fileManager = ...; //Initialize fileManager.read(new File("config.json"), new OnFileReadListener() { public void onFileRead(JSONObject jsonFile) { ... } public void onError(Exception ex) { ... } }); }
  • 7. Problemas… • Sincronizar múltiples llamadas? • Implementación síncrona?
  • 8. Problemas… • La pila de ejecución queda contaminada public class CacheFileManager implements FileManager { private Cache cache; public void read(File jsonFile, OnFileReadListener listener) { JSONObject object = cache.get(jsonFile); if(object != null) { listener.onFileRead(object); } else { ... } } }
  • 9. Problemas… • Sincronizar múltiples llamadas? • Implementación síncrona? • En qué hilo se ejecuta el Listener?
  • 10. Problemas… • Sincronizar múltiples llamadas? • Implementación síncrona? • En qué hilo se ejecuta el Listener? • Es esto “clean code”?
  • 11. Problemas… Output arguments are counterintuitive. Readers expect arguments to be inputs, not outputs. If your function must change the state of something, have it change the state of the object it is called on. Robert C. Martin
  • 12. Promise style… public void foo() { FileManager fileManager = ...; //Initialize Promise promise = fileManager.read(new File("config.json")); } public class FileManager { public Promise read(File jsonFile) { ... } }
  • 13. Patrón Promise Objeto que hace de proxy con el resultado de una operación El resultado suele ser desconocido debido a que su cálculo aún no ha acabado
  • 14. Patrón Promise. Características • Código más legible • Concurrencia más sencilla • Tests más sencillos • Sin ArgumentCaptors para capturar callbacks que luego estimular.
  • 15. jDeferred • Implementación Java del patrón Promise • Inspirado en Deferred Object de jQuery • Soporte específico para Android • Código muy compacto con Lambdas en Java 8 • http://jdeferred.org
  • 16. jDeferred. Claves • Promise : interface • Promesa que recibes al realizar una operación. • DeferredObject : class • Objeto con el que controlas el estado de la promesa • AndroidDeferredObject • DeferredManager : interface • Gestor de promesas • DefaultDeferredManager implementación por defecto • AndroidDefererdManager
  • 17. jDeferred. Flujo Hilo 2 create Cliente API DeferredObject init attachCallbacks resolve() executeCallbacks read()
  • 18. • Vamos a implementar una API sencilla jDeferred. Caso práctico I public class FileManager { public Promise<JSONObject, Exception, Void> read(File jsonFile) { ... } }
  • 19. • Creamos un DeferredObject • Realizamos la operación en background • Devolvemos la promesa jDeferred. Caso práctico II public Promise<JSONObject, Exception, Void> read(File jsonFile) { DeferredObject<JSONObject, Exception, Void> deferredObject = new DeferredObject<>(); doReadAsync(jsonFile, deferredObject); return deferredObject.promise(); }
  • 20. • El trabajo lo dejamos para que lo ejecute un ThreadPool jDeferred. Caso práctico III private Executor threadPool = Executors.newSingleThreadExecutor(); //Whatever thread pool private void doReadAsync(File jsonFile, DeferredObject<JSONObject, Exception, Void> deferredObject) { threadPool.execute(new Runnable() { @Override public void run() { doTryRead(jsonFile, deferredObject); } }); }
  • 21. • Tratamos el caso de error e implementamos la lógica jDeferred. Caso práctico IV private void doTryRead(File jsonFile, DeferredObject<JSONObject, Exception, Void> deferredObject) { try { deferredObject.resolve(doRead(jsonFile)); } catch (Exception ex) { deferredObject.reject(ex); } } private JSONObject doRead(File jsonFile) throws IOException, ParseException { JSONObject jsonObject = ...; //Read the file return jsonObject; }
  • 22. • Usando la API que hemos creado jDeferred. Caso práctico V FileManager fileManager = new FileManager(); fileManager.read(new File("config.json")) .done(new DoneCallback<JSONObject>() { @Override public void onDone(JSONObject result) { config.init(result); view.showMessage("Config loaded."); } }).fail(new FailCallback<Exception>() { @Override public void onFail(Exception ex) { config.initWithDefaults(); view.showMessage("Default config loaded."); } });
  • 23. • Con Java 8 queda aún más compacto jDeferred. Caso práctico V FileManager fileManager = new FileManager(); fileManager.read(new File("config.json")) .done((result) -> { config.init(result); view.showMessage("Config loaded."); }).fail((ex) -> { config.initWithDefaults(); view.showMessage("Default config loaded."); });
  • 24. jDeferred. Caso práctico VI • Mocking de forma sencilla private void givenSomeValidConfigFile() { FileManager fileManager = mock(FileManager.class); JSONObject jsonObject = ...//Create the mock config DeferredObject<JSONObject, Exception, Void> deferredObject = new DeferredObject<>(); when(fileManager.read(any(File.class))).thenReturn(deferredObject.resolve(jsonObject)); }
  • 25. Flexibilidad • Implementación síncrona de la API muy sencilla private Cache cache = new Cache(); //Some cache private FileManager networkFileManager = new NetworkFileManager(); public Promise<JSONObject, Exception, Void> read(File jsonFile) { JSONObject jsonObject = cache.get(jsonFile); if (jsonObject != null) { return new DeferredObject().resolve(jsonObject); } else { return networkFileManager.read(jsonFile); //Delegate } }
  • 26. • ¿En qué hilo se ejecuta el Listener? ¿UI o Background? • UI • Cosas en el hilo de UI que no queremos • Background • Cuando queremos hacer algo en UI tenemos que recurrir a Handlers • Problema subyacente • Responsabilidad recae en la API: Bad idea  • Es el cliente de la API quien debe decidir esto Listeners en Android
  • 27. • AndroidDeferredObject • Wrapper de DeferredObject para añadir soporte para Android • Nuevos callbacks • AndroidDoneCallback • AndroidFailCallback • AndroidProgressCallback • AndroidAlwaysCallback • Método para elegir en que hilo se va a ejecutar • A partir de 1.2.5, se puede indicar con una anotación jDeferred en Android
  • 28. jDeferred en Android • Consejo: Crear clases abstractas que oculten el método public abstract class UIDoneCallback implements AndroidDoneCallback { public AndroidExecutionScope getExecutionScope() { return AndroidExecutionScope.UI; } } public abstract class BackgroundDoneCallback implements AndroidDoneCallback { public AndroidExecutionScope getExecutionScope() { return AndroidExecutionScope.BACKGROUND; } }
  • 29. jDeferred en Android • Adios Handlers! FileManager fileManager = new FileManager(); fileManager.read(new File("config.json")) .done(new BackgroundDoneCallback<JSONObject>() { @Override public void onDone(JSONObject result) { config.init(result); } }).done(new UIDoneCallback<JSONObject>() { @Override public void onDone(JSONObject result) { view.showMessage("Config loaded."); } });
  • 30. • CPUs con muchos cores • Algunos se apagan, pero hay un consumo mínimo • Usar todos de forma eficiente permite apagar la CPU antes • Un ThreadPool no es suficiente • Nos ayuda a lanzar trabajos en paralelo • ¿Cómo sincronizar trabajos dependientes entre si? • Herramientas de bajo nivel… complicadas de depurar. Paralelizar trabajo
  • 31. • DeferredManager. Permite lanzar y/o sincronizar promesas • Devuelve otra promesa Paralelizar trabajo DeferredManager deferredManager = new DefaultDeferredManager(); Promise configPromise = fileManager.read(new File("config.json")); Promise serverPromise = fileManager.read(new File("server.json")); Promise userPromise = fileManager.read(new File("user.json")); deferredManager.when(configPromise, serverPromise, userPromise) .done(new DoneCallback<MultipleResults>() { @Override public void onDone(MultipleResults results) { for (OneResult result : results) { view.showJSON((JSONObject) result.getResult()); } view.showMessage("All files loaded!"); } });
  • 32. Filters • Nos permiten manipular o transformar una promesa deferredManager.when(configPromise, serverPromise, userPromise) .then(new DoneFilter<MultipleResults, Config>() { @Override public Config filterDone(MultipleResults results) { JSONObject config = (JSONObject) results.get(0).getResult(); JSONObject server = (JSONObject) results.get(1).getResult(); JSONObject user = (JSONObject) results.get(2).getResult(); return new Config(config, server, user); } }) .done(result -> view.showConfig(result)) .fail(ex -> view.showMessage("Config not loaded :-("));
  • 33. Filters • Se puede aplicar a cualquier tipo de promesa fileManager.read(new File("config.json")) .then(new DoneFilter<JSONObject, Config>() { @Override public Config filterDone(JSONObject result) { return new Config(result); } }) .done(result -> view.showConfig(result)) .fail(ex -> view.showMessage("Config not loaded :-("));
  • 34. Pipes • Más potente que los filtros • Transformar con posibilidad de errores fileManager.read(new File("config.json")) .then(new DonePipe<JSONObject, Config, Exception, Void>() { @Override public Promise<Config, Exception, Void> pipeDone(JSONObject result) { DeferredObject<Config, Exception, Void> deferred = new DeferredObject<>(); if (Config.isValid(result)) { return deferred.resolve(new Config(result)); } else { return deferred.reject(new IllegalConfigException()); } } }) .done(result -> view.showConfig(result)) .fail(ex -> view.showMessage("Config not loaded :-("));
  • 35. Pipes • Pero también encadenar operaciones fileManager.read(new File("user/server.json")) .then(new DonePipe<JSONObject, JSONObject, Exception, Void>() { @Override public Promise<JSONObject, Exception, Void> pipeDone(JSONObject result) { Server server = new Server(result); return fileManager.read(server.getConfigPath()); } }) .done(result -> view.showConfig(result)) .fail(ex -> view.showMessage("User config not loaded :-("));
  • 36.
  • 37. jDeferred no es RxJava • Promesas tienen estado • No se puede reutilizar • Solo se puede llamar 1 vez a resolve() o reject() • A notify() si podemos llamar muchas veces • Para progreso, no para notificar cambios • Ni mejor ni peor, depende de nuestros requisitos.
  • 39. We are hiring! • ¿Quieres unirte a nosotros? • Buscas un ambiente creativo • Grandes desafíos • Desarrollar productos que cambien la vida de millones de personas Envíanos tu CV!
  • 41. ¿Preguntas? • jDeferred • http://jdeferred.org • Mi blog personal • http://raycoarana.com • Tuenti Developers Blog • http://corporate.tuenti.com/es/dev/blog Rayco Araña Software Engineer at Tuenti @raycoarana rayco@tuenti.com