Je suis la spécification ici et je ne sais pas si cela permet à onFulfilled d'être appelé avec plusieurs arguments. Par exemple:
promise = new Promise(function(onFulfilled, onRejected){
onFulfilled('arg1', 'arg2');
})
tel que mon code:
promise.then(function(arg1, arg2){
// ....
});
recevrait à la fois arg1
et arg2
?
Je me fiche de la façon dont une mise en œuvre de promesses spécifiques le fait, je souhaite suivre de près les spécifications du w3c pour les promesses.
javascript
promise
badunk
la source
la source
Réponses:
Non, seul le premier paramètre sera traité comme valeur de résolution dans le constructeur de promesse. Vous pouvez résoudre avec une valeur composite comme un objet ou un tableau.
C'est là que je crois que vous vous trompez. La spécification est conçue pour être minimale et est conçue pour interopérer entre les bibliothèques de promesse. L'idée est d'avoir un sous-ensemble que les futurs DOM, par exemple, peuvent utiliser de manière fiable et que les bibliothèques peuvent consommer. Les implémentations Promise font ce que vous demandez
.spread
depuis un moment maintenant. Par exemple:Avec Bluebird . Une solution si vous voulez cette fonctionnalité est de la polyfill.
Cela vous permet de faire:
Avec les promesses natives à l'aise violon . Ou utilisez la diffusion qui est maintenant (2018) courante dans les navigateurs:
Ou avec wait:
la source
.spread
comme Bluebird - la raison pour laquelle ce n'est pas dans la spécification est que garder la spécification minimale est vraiment un gros problème afin de permettre l'interopérabilité entre le code et les bibliothèques.Promise.all
le tableau avant d'appliquer la fonction plutôt que de simplement l'.then
utiliser pour gérer certaines bibliothèques de sucre. Ce n'est pas obligatoire, mais c'est mignon.return Promise.all(args).then(function(args){return fn.apply(this, args);})
spread
est un palliatif. ES6 introduit la déstructuration et l'opérateur de repos / propagation, qui éliminent le besoinspread
pur et simple..then(([a, b, c]) => {})
Vous pouvez utiliser la déstructuration E6:
Déstructuration d'objets:
Déstructuration du tableau:
la source
La valeur de réalisation d'une promesse est parallèle à la valeur de retour d'une fonction et la raison de rejet d'une promesse est parallèle à l'exception lancée d'une fonction. Les fonctions ne peuvent pas renvoyer plusieurs valeurs, les promesses ne doivent donc pas avoir plus d'une valeur d'exécution.
la source
Pour autant que je sache, en lisant la spécification ES6 Promise et la spécification standard de la promesse, il n'y a pas de clause empêchant une implémentation de gérer ce cas - cependant, elle n'est pas implémentée dans les bibliothèques suivantes:
Je suppose que la raison pour laquelle ils omettent les résolutions multi-arg est de rendre l'ordre de changement plus succinct (c'est-à-dire que vous ne pouvez renvoyer qu'une seule valeur dans une fonction, cela rendrait le flux de contrôle moins intuitif) Exemple:
la source
return Promise.of(x, y)
au lieu d'une valeur scalaire duthen
rappel.Voici une solution CoffeeScript.
Je cherchais la même solution et j'ai trouvé quelque chose de très intéressant dans cette réponse: Rejeter les promesses avec plusieurs arguments (comme $ http) dans AngularJS
la réponse de ce mec Florian
Et pour l'utiliser:
la source
->
être=>
?Excellente question et excellente réponse de Benjamin, Kris et al - merci beaucoup!
J'utilise ceci dans un projet et j'ai créé un module basé sur le code de Benjamin Gruenwald . Il est disponible sur npmjs:
Ensuite, dans votre code, faites
Si vous utilisez une bibliothèque telle que
any-promise
Peut-être que d'autres trouvent cela utile aussi!
la source
L'affectation de déstructuration dans ES6 serait utile ici.
la source
Étant donné que les fonctions en Javascript peuvent être appelées avec n'importe quel nombre d'arguments et que le document ne place aucune restriction sur les
onFulfilled()
arguments de la méthode en plus de la clause ci-dessous, je pense que vous pouvez passer plusieurs arguments à laonFulfilled()
méthode tant que la valeur de la promesse est le premier argument.la source
Pour citer l'article ci-dessous, "" puis "prend deux arguments, un rappel pour un cas de réussite et un autre pour le cas d'échec. Les deux sont facultatifs, vous pouvez donc ajouter un rappel pour le cas de réussite ou d'échec uniquement."
Je regarde généralement cette page pour toute question de base sur les promesses, faites-moi savoir si je me trompe
http://www.html5rocks.com/en/tutorials/es6/promises/
la source
new Promise
a la syntaxefunction(resolve, error)
toutthen
a la syntaxe.then(function(arg) {
.then(function(/*resolve args*/){/*resolve handler*/}, function(/*reject args*/){/*reject handler*/})