2
votes

Promesses d'enchaînement, mauvais ordre

J'aimerais comprendre le chaînage des promesses en Javascript. Alors j'ai écrit ce petit violon: https://jsfiddle.net/GarfieldKlon/89syq4fh/

Cela fonctionne comme prévu. c attend b, et b attend a.

Mais quand je change ces lignes en:

a().then( result => console.log(result))
.then( () => {return b().then( result => console.log(result))})
.then( () => {return c().then( result => console.log(result))});

J'ai donc ajouté les accolades autour de b et c et ensuite le résultat est 1, 3, 2. Et je ne comprends pas pourquoi.

Quand j'ajoute un retour, cela fonctionne à nouveau:

a().then( result => console.log(result))
.then( () => {b().then( result => console.log(result))})
.then( () => {c().then( result => console.log(result))});

Mais pourquoi? Quand il n'y a pas d'accolades, vous n'êtes autorisé à écrire qu'une seule déclaration, n'est-ce pas? Et cette déclaration est retournée implicitement?

Et lorsque vous utilisez des accolades, vous devez explicitement renvoyer quelque chose?

Mais pourquoi cela gâche-t-il l'ordre lorsque vous utilisez des accolades sans retour? Et pourquoi enregistre-t-il encore quelque chose lorsque le retour est manquant?


6 commentaires

avec les accolades, vous devez renvoyer la valeur, c'est la grosse flèche qui fonctionne.


Dans les deux cas, l'ordre est aléatoire. Revenir dans le bloc puis est en fait pour le prochain bloc puis à consommer (ce qui ne se produit pas dans votre cas)


Voir developer.mozilla.org/en-US / docs / Web / JavaScript / Reference /…


Cela n'a vraiment rien à voir avec des promesses, c'est juste comment fonctionne la syntaxe de la fonction de flèche. Si vous définissez un corps de bloc, rien ne sera retourné à moins que vous ne le fassiez explicitement.


@varun agarwal dans quels cas l'ordre est-il aléatoire? Lors du chaînage des promesses, l'ordre ne doit pas être aléatoire, n'est-ce pas?


Le chaînage d'une pomise est séquentiel mais chacune des fonctions enchaînées puis a une fonction asynchrone qui fait que leur fonction puis s'exécute de manière aléatoire.


3 Réponses :


0
votes

Cela a à voir avec les fonctions fléchées. Lorsque vous omettez les accolades, le retour est implicite. Donc

const f = () => { return 42; };

équivaut à

const f = () => 42;

Aussi, b (). Then (quelque chose) .then (somenthingElse) code> n'est toujours qu'une seule expression, il peut donc être retourné implicitement.


0 commentaires

1
votes

Lorsque vous utilisez la syntaxe des flèches, vous pouvez l'interpréter de plusieurs manières:

() => {'hello'; return;}

équivaut à

.then( () => {b().then( result => console.log(result))})

Cependant, lorsque vous faites

() => {'hello'}

comme similaire à ce que vous avez écrit:

() => { return 'hello'; }

alors vous pouvez interpréter cela comme

() => 'hello'

Donc, dans le code, vous promettez de gérer b (). Then (result => console.log (result)) est appelé avant un return nul; est terminé. Vous ne renvoyez pas du tout l'objet de promesse résultant. Il est appelé lorsque b est terminé, peu importe ce que vous faisiez.


2 commentaires

Merci pour les exemples utiles. Ainsi, «c» est appelé avant «b» car les deux ne sont pas des promesses et «c» a le temps d'attente le plus court. Correct? Si oui, je pense que je l'ai compris.


@GarfieldKlon b et c sont des fonctions qui retournent avec un objet de promesse. Pourtant, vous ne retournez pas ces objets de promesse dans la chaîne a () .... puis dans votre exemple (celui-là sans return ). Le a.then a reçu un retour nul, qui n'est pas un objet de promesse. Donc, il va plus loin au lieu d'attendre quand l'objet de promesse de b () est rempli. Dans l'exemple avec l'instruction return , a.then a bien reçu un objet de promesse (de b () ) et attend cela avant de s'exécuter l'instruction .then suivante.



2
votes

Quand il n'y a pas d'accolades, vous n'êtes autorisé à écrire qu'une seule expression qui est retournée implicitement? Et lorsque vous utilisez des accolades, vous devez explicitement renvoyer quelque chose?

Oui .

Mais pourquoi gâche-t-il l'ordre lors de l'utilisation d'accolades sans retour? Et pourquoi enregistre-t-il encore quelque chose lorsque le retour est manquant?

Parce que la fonction promise then repose sur des valeurs de retour pour le chaînage.

N'oubliez pas que puis renvoie une nouvelle promesse pour le résultat du rappel . Lorsque ce résultat est une autre promesse, il attend le résultat de cette promesse intérieure avant de remplir la promesse retournée - celle sur laquelle vous enchaînez le deuxième appel then () .

Si votre rappel démarre b (). then (…) mais renvoie undefined , l'étape suivante dans la chaîne (le c () call) n'attend pas que b se termine.


0 commentaires