2014-05-04 4 views
-1

J'ai une API synchrone pour appeler un serveur (HTTP GET) actuellement implémenté avec XMLHttpRequest.Interface HTTP synchrone avec javascript

L'API effectue une mise en cache et, si le cache n'est pas considéré comme trop ancien, revient du cache et appelle le serveur asynchrone pour actualiser le cache.

Parfois, le cache n'est pas disponible ou est trop ancien, puis l'API est synchrone et appelle le serveur pour extraire une valeur précise avant de renvoyer le résultat à l'appelant. Le résultat contiendra un indicateur de succès booléen avec la charge utile et le client gère le résultat en regardant ce drapeau.

Il y a deux problèmes que je peux voir en faisant comme ceci; Lorsque le cache n'est pas disponible et que le serveur n'est pas joignable ou répond lentement, je voudrais faire apparaître un spinner pour que l'utilisateur sache que nous attendons le serveur. En outre, je voudrais définir une valeur de délai d'attente où nous abandonnons la requête du serveur et gérons l'erreur en conséquence.

On dirait que je devrais pouvoir utiliser les opérations setTimout mais je n'ai pas réussi. De préférence je voudrais garder les clients intacts (ne pas changer l'API en asynchrone).

Existe-t-il un moyen d'y parvenir?

+2

Synchronous AJAX est une très mauvaise idée. – plalx

+0

Oui en effet, donc j'ai besoin de le changer. Vous avez une recommandation? Pour être clair, l'interface (mon code) doit être synchrone, mais l'implémentation doit être asynchrone, ou je vais redessiner les clients pour utiliser asynch. En regardant les options que j'ai. – daljian

+0

La partie bloquante de "synchrone" est la mauvaise chose. La seule façon de changer cela est d'utiliser JAX asynchrone, ce qui conduit à une interface asynchrone. Redessiner les clients pour qu'ils soient asynchrones n'est pas non plus une mauvaise idée. – Bergi

Répondre

0

L'API synchrone a été rendue sensible en maintenant un cache extrait du serveur asynchrone. Le cache a été protégé par une période de grâce en vertu de laquelle nous ne retirons pas de nouvelle valeur du serveur pour éviter de marteler le serveur. Pour la plupart des cas, cela suffisait à affirmer qu'il y avait toujours une valeur mise en cache qui pouvait être fournie au client.

Pour quelques cas où nous devons extraire de nouvelles données, la meilleure solution serait de passer entièrement en mode asynchrone, c'est-à-dire de mettre à jour le code client.

Actuellement, ce n'est pas une option, donc en plus de ce qui précède, un mécanisme de pulsation a été mis en place pour basculer l'état en ligne/hors ligne pour empêcher les tentatives synchrones hors ligne.

Questions connexes