Aujourd'hui, j'ai vu un article sur la mise en œuvre d'un menu de liaison infinie. J'ai vu que l'auteur ne le comprenait pas lorsqu'il s'agissait de l'expiration des données ;
- Ce à quoi il est facile de penser, c'est le problème de l'expiration asynchrone : imaginez que le menu de premier niveau change, déclenchant l'extraction du contenu du menu de deuxième niveau, mais la vitesse du réseau est lente et le processus prend 3 secondes . Après 1 seconde, l'utilisateur modifie à nouveau le menu de premier niveau, déclenchant à nouveau l'extraction du contenu du menu de deuxième niveau. À ce moment, la vitesse du réseau est plus rapide, les données sont renvoyées après 1 seconde et la seconde. le menu de niveau est restitué ; mais 1 seconde plus tard, le menu de premier niveau est restitué. Le résultat de cette requête est renvoyé et le menu de deuxième niveau est à nouveau rendu. Cependant, en fait, le menu de premier niveau. a changé depuis et le contenu a expiré. Ce rendu est erroné. Nous pouvons utiliser des fermetures pour effectuer une vérification de l'expiration des données.
- Ce qui n'est pas facile à penser, c'est le problème de l'expiration synchrone (en fait, c'est aussi asynchrone, mais sans interaction io, c'est une fonction de timeout avec un temps tampon de 0). file d'attente, l'expiration peut se produire si vous ne faites pas attention. Dans le code, il y aura des notes pertinentes.
Pouvez-vous comprendre la raison de la première expiration ? Quelle est la raison de la seconde ? Comment est-ce arrivé?
Comme l'a dit l'auteur, il s'agit d'une fonction de timeout avec un temps tampon de 0. Si la mise à jour du menu de premier niveau vers le menu de deuxième niveau est écrite dans la fonction setTimeout(), il s'agit d'une opération asynchrone. Il arrivera également que les opérations suivantes mettent à jour l'interface en premier et que les résultats des opérations précédentes expirent. .