Last active
August 29, 2015 14:17
-
-
Save raphamorim/eda1b6099197a0edfd07 to your computer and use it in GitHub Desktop.
Promise Example
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// using bluebird | |
var Servico = { | |
listarUsuarios: function(callback) { | |
setTimeout(function(){ callback(null, [{nome:"Gabriel"}, {nome:"Raphael"}]) }, 100); | |
}, | |
listarFavoritos: function(usuario, callback) { | |
if (usuario.nome === "Gabriel") { | |
setTimeout(function(){ callback(null, ["http://www.google.com.br"]) }, Math.random() * 100); | |
} else { | |
//setTimeout(function(){ callback(null, ["http://www.disney.com"]) }, Math.random() * 100); | |
setTimeout(function(){ callback(new Error("Favoritos não encontrado para o usuário!")) }, Math.random() * 100); | |
} | |
}, | |
listarAmigos: function(usuario, callback) { | |
if (usuario.nome === "Gabriel") { | |
setTimeout(function(){ callback(null, [{nome:"Raphael"}, {nome:"Bruno"}]) }, Math.random() * 100); | |
} else { | |
setTimeout(function(){ callback(null, [{nome:"Gabriel"}, {nome:"Bruno"}]) }, Math.random() * 100); | |
} | |
} | |
}; | |
var imprimirUsuario = function(usuario) { | |
console.log("Usuário:", usuario.nome); | |
} | |
var imprimirFavoritos = function(favoritos) { | |
console.log("Favoritos:", favoritos.join(",")); | |
} | |
var imprimirAmigos = function(amigos) { | |
console.log("Amigos:", amigos.map(function(amigo){return amigo.nome;}).join(",")); | |
} | |
var imprimirFavoritosAmigo = function(amigo, favoritos) { | |
console.log(amigo.nome, "-- favoritos: ", favoritos.join(', ')); | |
} | |
var imprimirUsuariosCompleto = function(dadosUsuario) { | |
imprimirUsuario(dadosUsuario.usuario); | |
imprimirFavoritos(dadosUsuario.favoritos); | |
imprimirAmigos(dadosUsuario.amigos); | |
dadosUsuario.amigosComFavoritos.forEach(function(f) { | |
imprimirFavoritosAmigo(f.amigo, f.favoritos); | |
}); | |
} | |
function testeSemPromise() { | |
console.log("TESTE 2"); | |
var once = function(fn) { | |
var executed = false; | |
return function() { | |
if (executed) { | |
return; | |
} | |
console.log(fn); | |
executed = true; | |
var args = Array.prototype.slice.call(arguments); | |
return fn.apply(this, args); | |
} | |
} | |
Function.prototype.once = function() { | |
return once(this); | |
} | |
var listarUsuariosCompleto = function (done) { | |
done = done.once(); | |
Servico.listarUsuarios(function(err, usuarios) { | |
if (err) return done(err); | |
usuarios.forEach(function(usuario) { | |
Servico.listarFavoritos(usuario, function(err, favoritos) { | |
if (err) return done(err); | |
Servico.listarAmigos(usuario, function(err, amigos) { | |
if (err) return done(err); | |
var total = amigos.length; | |
var amigosComFavoritos = []; | |
amigos.forEach(function(amigo) { | |
Servico.listarFavoritos(amigo, function(err, favoritosAmigo) { | |
if (err) return done(err); | |
amigosComFavoritos.push({amigo: amigo, favoritos: favoritosAmigo}); | |
if (--total === 0) { | |
console.log("--------------------------------"); | |
done(null, { | |
usuario: usuario, | |
amigos: amigos, | |
amigosComFavoritos: amigosComFavoritos, | |
favoritos: favoritos | |
}); | |
} | |
}); | |
}); | |
}); | |
}); | |
}); | |
}); | |
}; | |
listarUsuariosCompleto(function(err, dadosUsuario) { | |
if (err) { | |
console.log("ERROR", err.message); | |
} else { | |
imprimirUsuariosCompleto(dadosUsuario); | |
} | |
}); | |
} | |
function testeComPromises() { | |
console.log("TESTE 3"); | |
Servico = Promise.promisifyAll(Servico); | |
var listarAmigosComFavoritos = function(usuario) { | |
if (!usuario) | |
throw new Error("Usuário é obrigatório"); | |
return Servico.listarAmigosAsync(usuario).map(function(amigo) { | |
return Servico.listarFavoritosAsync(amigo) | |
.then(function(favoritos) { | |
return {amigo: amigo, favoritos: favoritos} | |
}); | |
}); | |
}; | |
Servico.listarUsuariosAsync() | |
.map(function(usuario) { | |
return Promise.join( | |
listarAmigosComFavoritos(usuario), | |
Servico.listarFavoritosAsync(usuario), | |
function (amigosComFavoritos, favoritos) { | |
var amigos = amigosComFavoritos.map(function(a) { return a.amigo; }); | |
return {usuario: usuario, amigos: amigos, amigosComFavoritos: amigosComFavoritos, favoritos: favoritos}; | |
} | |
); | |
}) | |
.each(imprimirUsuariosCompleto).then(function(usuariosCompleto) { | |
console.log(usuariosCompleto); | |
}).catch(function(e) { | |
console.log("ERROR", e.message); | |
}); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment