Skip to content

Instantly share code, notes, and snippets.

@raphamorim
Last active August 29, 2015 14:17
Show Gist options
  • Save raphamorim/eda1b6099197a0edfd07 to your computer and use it in GitHub Desktop.
Save raphamorim/eda1b6099197a0edfd07 to your computer and use it in GitHub Desktop.
Promise Example
// 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