Bluebird de la Promesse.tous les() la méthode quand une promesse est dépendante d'une autre
Je suis en train d'écrire un peu de code qui ressemble actuellement ce parce que j'ai des dépendances dans mon code. Je me demandais si il y avait une manière plus propre de le faire avec la Promesse.tous les()? Voici mon pseudo code:
return someService.getUsername()
.then(function(username) {
user = username;
})
.then(function() {
return someService.getUserProps(user);
})
.then(function(userProps) {
userProperties = userProps;
return someService.getUserFriends(user);
})
.then(function(userFriends) {
friends = userFriends;
})
.catch(error)
.finally(function(){
//do stuff with results
});
La chose importante est que j'ai besoin de l'utilisateur avant que je puisse faire les deux appels pour getUserProps() et getUserFriends(). Je pensais que je pouvais utiliser Promesse.tous les() de cette façon:
var user = someService.getUsername()
.then(function(username) {
user = username;
})
var getUserProps = someService.getUserProps(user);
var getUserProps = someService.getUserFriends(user);
return Promise.all(user, getUserProps, getUserFriends, function(user, props, friends) {
//do stuff with results
})
Mais je ne peux pas obtenir que cela fonctionne. Est-ce le bon cas d'utilisation .tous?
Vous devez vous connecter pour publier un commentaire.
Promise.all()
est conçu pour fonctionnement en parallèle lorsque vous lancez un tas d'opérations asynchrones pour s'exécuter en même temps et puis il vous dit quand ils sont tous fait.Il n'a pas d'ordre un rapport à la fin de l'autre en quelque sorte. Donc, vous ne pouvez pas l'utiliser pour attendre que l'utilisateur soit prêt et ensuite les autres opérations utilisation de cet utilisateur. Il n'est tout simplement pas conçu pour faire.
Vous pourriez obtenir de l'utilisateur en premier et ensuite quand il est complet, vous pouvez utiliser
Promise.all()
avec vos deux autres opérations qui je pense peut être exécuté en même temps et ne dépendent les uns des autres.Vous pouvez utiliser
.all
mais vous allez avoir pour s'assurer qu'elles sont exécutées de manière séquentielle votre code, vous pouvez le faire en.then
ing eux comme vous l'avez fait. Si vous faites cela, vous devez utiliser.join
qui est une abréviation pour.all([...]).spread(...
.Si ce que vous cherchiez à résoudre est la fermeture/l'imbrication question - alors, c'est la façon de le faire.
.bind
si vous avez besoin de passer des paramètres supplémentaires ou une fonction anonyme.user.then(getUserProps)
qui fait la même chose queuser.then(function(user){ return getUserProps(user); })
seulement plus court et plus concis. Le point ici est que la promesse agit comme un proxy pour la valeur directement.Promesse.tous les() est une façon d'exécuter une liste de promesses en parallèle, mais si nous voulons exécuter une liste de promesses dans une série où l'on dépend de l'autre, nous avons à résoudre un peu différemment