Construire une chaîne de promesses de manière récursive en JavaScript : considérations sur la mémoire
En JavaScript, la construction récursive d'une chaîne de promesses peut donner lieu à la fois à une pile d'appels et une « chaîne de résolution ». Bien qu'il puisse sembler que cela entraînerait un pic de mémoire plus important que la récursion ou la construction d'une chaîne de promesses seule, ce n'est pas le cas.
La chaîne de résolution est essentiellement une série de promesses qui sont résolues avec le le plus intérieur, représentant le même résultat. Lorsque le cas de base de la récursion est satisfait, la promesse la plus interne est résolue avec une valeur réelle et toutes les promesses précédentes sont résolues avec la même valeur.
Contrairement à une chaîne de promesses construite à l'aide de then(), ceci la chaîne de résolution ne crée pas une chaîne « large » de promesses. Au lieu de cela, il construit une chaîne « profonde », ce qui entraîne un coût de mémoire O(n) pour remonter la chaîne de résolution. Une fois le résultat résolu, toutes les promesses, sauf la plus externe, peuvent être récupérées.
En revanche, une chaîne de promesses construite à l'aide d'une méthode telle que réduire créerait un pic de mémoire en allouant n promesses à la fois. Ces promesses sont ensuite lentement résolues une par une, les promesses précédemment résolues étant récupérées.
Bien que certains puissent anticiper un pic de mémoire avec la chaîne de résolution récursive, sa complexité spatio-temporelle constante en fait une technique viable pour boucles asynchrones avec une condition dynamique. En fait, cette construction est couramment utilisée dans la monade IO de Haskell pour de telles boucles.
Quant aux différences de consommation de mémoire entre les bibliothèques de promesses, oui, elles peuvent varier. La spécification ES6 oblige Promises à inspecter la valeur à chaque appel de résolution, ce qui évite l'effondrement de la chaîne. Cela signifie que l'utilisation d'une implémentation de promesse de fuite peut entraîner une fuite de mémoire lors de l'utilisation de la récursivité asynchrone. Dans de tels cas, il peut être préférable d'utiliser des rappels et "l'anti-modèle différé" pour obtenir le résultat souhaité.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!