Par exemple, j'ai un A.func1() qui est asynchrone et qui peut renvoyer un objet x1. J'ai aussi un B.func2() qui est également asynchrone et doit être exécuté en fonction de x1, puis B. .func2 renvoie une valeur finale t, et certains affichages d'invites seront effectués en fonction de cette valeur finale t. Comment dois-je écrire cela ?
Le code que j'ai écrit moi-même est comme ça
A.func1().
then(function(x1) {
B.func2(x1).
then(function(t) {
//do something
})
})
Mais on a l'impression que l'effet est le même, que vous l'utilisiez ou non... ça se transforme quand même en pyramide
En réponse au commentaire supplémentaire dans les commentaires sur "sauver l'état lors de l'appel continu de promesses", j'aimerais élaborer sur plusieurs stratégies
La meilleure stratégie : la dé-déclaration
Autrement dit, ajustez votre logique pour que le processus appelant de A.func1, B.func2 et la fonction anonyme (appelons-la func3) ne contienne pas d'état, c'est-à-dire que func3 s'appuie uniquement sur la sortie de func2 , pas la sortie func1 ; ou laissez func2 ne pas dépendre de func1, utilisez quelque chose comme
Promise.all
pour obtenir les résultats de func1 et func2 en même temps et lancez-les dans func3Stratégie centrale : statut de maintenance variable "global"
Avantages : l'état peut être étendu à state.x2 .x3...
La méthode bind deProblème : Si une longue chaîne d'appels a des états complexes, il est facile de contaminer des bugs, et la maintenabilité du code sera sérieusement réduite
.bluebird
peut lier thisArg et peut être utilisée pour conserver l'état. Le principe est le mêmeLa stratégie du milieu : livraison supplémentaire temporaire
Avantages : Sans état, si la chaîne d'appel est longue, cet état supplémentaire est contrôlé entre deux étapes, conservant une meilleure maintenabilité et moins sujet aux bugs
Inconvénients : Si chaque étape d'une longue chaîne d'appels a un état, elle deviendra extrêmement verbeuse
Bien sûr, l'intérieur peut également être encapsulé et optimisé par vous-même
Dernière solution : Etat de maintenance fermeture
En fait, c'est la manière originale d'écrire la question. Je pense que le principal problème est que la question a été rétrogradée à "l'enfer du rappel" d'origine ou à l'embarras de la pyramide de rappel
L'avantage c'est que...ça marche
Renvoie un objet de
then
directement à l'intérieur dePromise
, comme suit :En réponse au problème évoqué dans votre commentaire, si vous n'utilisez pas la bibliothèque
Promise
tierce, vous pouvez l'utiliser comme suit :L'utilisation d'une bibliothèque
Promise
tierce peut simplifier ce processus.Promise renverra un objet de promesse, afin qu'il puisse utiliser des appels en chaîne élégants.
Si la valeur de retour de la fonction in then est une quantité directe, elle sera utilisée comme paramètre de then du prochain appel de chaîne
Si la valeur de retour a l'interface de promesse, le résultat de la résolution de la promesse est renvoyée
Utilisez q comme exemple