Quelle est la différence entre le retour de la valeur ou de la Promesse.résoudre à partir de l'époque()
Quelle est la différence entre:
JS:
new Promise(function(res, rej) {
res("aaa");
})
.then(function(result) {
return "bbb";
})
.then(function(result) {
console.log(result);
});
et ce:
JS:
new Promise(function(res, rej) {
res("aaa");
})
.then(function(result) {
return Promise.resolve("bbb");
})
.then(function(result) {
console.log(result);
});
Je demande que je reçois des comportements différents à l'Aide Angulaire et $service http avec le chaînage .alors(). Un peu trop de code donc d'abord l'exemple ci-dessus.
- Ce "comportement différent" voyez-vous? Les deux exemples devraient travailler et de se comporter approximativement la même. Le
Promise.resolve()
dans le deuxième exemple est inutile. - Il n'y a rien de mal que ce soit avec le retour d'une promesse d'un
then
gestionnaire, en fait, c'est un aspect clé de l'promesses spec que vous pouvez le faire. - Notez que cela fonctionne avec arbitrairement imbriquée
then
s - les "autres langues" terme utilisé pour cela est quethen
est à la fois unmap
et unflatMap
. - dans la ligne 2 pourquoi avez-vous de l'appeler res("aaa"), pourquoi ne peut-retour "aaa" être suffisant, et la Promesse de captures de la résolution() de la même manière qu'il attrape les exceptions pour les rejeter() ?
Vous devez vous connecter pour publier un commentaire.
La règle est que, si la fonction qui est dans le
then
gestionnaire retourne une valeur, la promesse résout/rejette avec cette valeur, et si la fonction retourne une promesse, ce qui se passe, la prochainethen
clause de lathen
clause de la promesse de la fonction renvoyée, donc, dans ce cas, le premier exemple tombe à travers la séquence normale de lathens
et imprime les valeurs que l'on peut attendre, dans le deuxième exemple, la promesse de l'objet qui revient lorsque vous nePromise.resolve("bbb")
s'est alors l'then
qui est appelé lorsque le chaînage(à toutes fins utiles). La façon dont il fonctionne réellement est décrite en détail ci-dessous.Citant les Promesses/A+ caractéristiques:
La clé de chose à noter ici est cette ligne:
then
gestionnaire retourne une promesse. +1 pour la spécification de référence.[[Resolve]]
est appelé à la fois surthen
ableaux de valeurs et donc, essentiellement, il encapsule une valeur avec la promesse de sortereturn "aaa"
est le même quereturn Promise.resolve("aaa")
etreturn Promise.resolve("aaa")
est le même quereturn Promise.resolve(Promise.resolve("aaa"))
- depuis résoudre est la quantité de l'appeler sur une valeur plus d'une fois a le même résultat."aaa"
etreturn Promise.resolve("aaa")
sont interchangeables dansthen
ables dans tous les cas?Vos deux exemples devraient se comporter à peu près la même.
Une valeur retournée à l'intérieur d'un
then()
gestionnaire devient la valeur de la résolution de la promesse retourné par cethen()
. Si la valeur retournée à l'intérieur de la.then
est une promesse, la promesse retourné parthen()
sera "adopter l'état" de cette promesse et de résoudre ou de rejeter tout comme le retour de la promesse ne.Dans votre premier exemple, vous revenez
"bbb"
dans la premièrethen()
gestionnaire, de sorte"bbb"
est passé dans la prochainethen()
gestionnaire.Dans votre deuxième exemple, vous retournez une promesse qui est immédiatement résolu avec la valeur
"bbb"
, donc"bbb"
est passé dans la prochainethen()
gestionnaire. (LePromise.resolve()
ici est étrangère).Le résultat est le même.
Si vous pouvez nous montrer un exemple qui fait expositions différents comportements, nous pouvons vous dire pourquoi ce qui se passe.
Promise.resolve();
vsreturn;
?undefined
au lieu de"bbb"
.En termes simples, à l'intérieur d'un
then
fonction de gestionnaire:A) Lorsque
x
est une valeur (nombre, chaîne de caractères, etc):return x
est équivalent àreturn Promise.resolve(x)
throw x
est équivalent àreturn Promise.reject(x)
B) Lorsque
x
est une Promesse qui est déjà réglé (pas dans l'attente de plus):return x
est équivalent àreturn Promise.resolve(x)
, si la Promesse a déjà été résolu.return x
est équivalent àreturn Promise.reject(x)
, si la Promesse a déjà été rejeté.C) Lorsque
x
est une Promesse qui est en attente:return x
sera de retour d'une attente de la Promesse, et elle sera évaluée sur lathen
.Lire plus sur ce sujet sur le Promesse.le prototype.alors() docs.
Vous avez déjà obtenu une bonne réponse explicite. J'ai pensé que je devrais ajouter un court.
Les choses suivantes sont identiques à Promesses/A+ promesses:
Promise.resolve
(Dans votre Angulaire cas c'est$q.when
)new $q
.then
de rappel.Si les conditions suivantes sont identiques pour une promesse ou de la plaine valeur de X:
Et il n'est pas surprenant, les promesses de spécification est basée sur la Promesse Procédure De Résolution qui facilite l'interopérabilité entre les bibliothèques (comme $q et natif de promesses) et rend votre vie plus facile. Chaque fois qu'une promesse de résolution peut se produire une résolution de se créer une cohérence d'ensemble.