Y a-atomique javascript opérations pour faire face à l'Ajax asynchrone de la nature?
Je suis le chargement dynamique de code (fonctions) à partir d'un serveur et de l'exécuter comme du code javascript puis les stocker dans un tableau et de l'exécution. Tous ces extraits de code doit être exécuté exactement une fois. Le psuedocode suit en tant que tel
function fetch(foo){
if (foo in fooArray){
//Do Nothing
else{
//Fetch foo via Ajax and execute foo()
}
}
Le problème est beaucoup plus complexe, mais en gros, si je la commande ci-dessous
fetch('someFunctionName');
fetch('someFunctionName');
fetch('someFunctionName');
fetch('someFunctionName');
tous les quatre d'exécuter la if (foo in fooArray)
et suppose qu'il n'est pas dans le tableau, et tous les quatre vont procéder pour récupérer le code et l'exécuter. Je me souviens de retour dans la journée d'apprentissage sur les sémaphores et les mutex, il y a de telles choses pour le javascript.
- Apparemment, il est possible, depuis jQuery fait ceci: stackoverflow.com/questions/7131991/...
- J'ai écrit un blog à ce sujet Pourquoi pas de la simultanéité de l'outil en javascript
- le lien est rompu, devrait être: blog.uzairfarooq.com/...
Vous devez vous connecter pour publier un commentaire.
JavaScript est une belle langue qui fonctionne très bien avec des rappels asynchrones, les délais, les intervalles et les événements de l'utilisateur, mais ne pas avoir de problèmes de concurrence d'accès. Cela est possible parce que le JavaScript est essentiellement mono-thread - quel morceau de code est toujours exécutée de manière atomique et jamais interrompu par un autre thread en cours d'exécution JavaScript.
Votre
fetch()
fonction sera toujours exécuté sans interruption. Si elle est exécutée dans le cadre de l'AJAX de rappel et si plusieurs rappels AJAX sont en attente, ils seront en file d'attente.Un autre exemple: si vous avez un gestionnaire d'événement affecté à un élément d'entrée et vous déclencher l'événement à plusieurs reprises à la fois, les gestionnaires d'événements à ne pas être exécutées simultanément. Au lieu de cela, ils seront en file d'attente et exécutées de façon séquentielle. Ceci s'applique également à de nombreux événements déclenchés par
setTimeout()
/setInterval()
.Que d'un côté-note: ceci est une des raisons pour lesquelles node.js est tellement robuste: il n'utilise que seul thread et bloque jamais sur les I/O, mais utilise des rappels au lieu lorsque les données sont prêtes/événement se produit.
Javascript est essentiellement mono-thread, donc vous n'avez pas besoin d'un mutex. Votre fetch pourrait mettre en place des indicateurs tels que par la suite, récupérer des appels pourrait éviter de faire des appels ajax par exemple: