2010-07-28 3 views
3

Nous développons une application web utilisant GWT dans le frontal.Pourquoi Firefox attend-il qu'une fonction javascript soit terminée pour démarrer une autre fonction?

En GWT nous faisons des appels au serveur en ajoutant le code javascript comme indiqué ci-dessous:

public native static void call(int requestId, String url, ICall handler) /*-{ 
    var callback = "callback" + requestId; 

    //Create a script element. 
    var script = document.createElement("script"); 
    script.setAttribute("src", url+callback); 
    script.setAttribute("type", "text/javascript"); 
    script.setAttribute("async", "true"); 

    //Define the callback function on the window object. 
    window[callback] = function(response) { 
    [email protected]::handleResponse(Ljava/lang/String;)(response); 
    } 

    //Attach the script element to the document body. 
    document.body.appendChild(script); 
    }-*/; 

Certains appels prennent une minute pour remplir et quelques autres seulement quelques secondes. Si nous faisons plusieurs appels en même temps, tous sont exécutés en parallèle. Cela signifie qu'un appel qui se termine dans 2 secondes ne doit pas attendre jusqu'à ce qu'un appel qui dure une minute se termine. Cela est vrai dans Chrome et Safari. Cependant, Firefox attend que la première fonction invoquée se termine pour démarrer les autres fonctions.

Pourquoi Firefox attend-il qu'une fonction javascript soit terminée pour démarrer une autre fonction? Comment régler ceci?

Merci

+0

Nous ajoutons du code javascript au lieu d'utiliser l'objet Java RequestBuilder car nous voulons faire des requêtes inter-sites – Miguel

Répondre

0

Vous pourriez avoir à enfiler explicitement les processus pour faire Firefox les exécuter en parallèle (Firefox n'a pas eu un récent communiqué, de sorte que leur soutien parallèle peut être plus faible que le chrome et safari plus récemment mis à jour). Il se peut également que Firefox ait un peu de scrupule à accéder à un objet à partir de plusieurs méthodes en même temps.

Une raison pour laquelle le code est tous mis en commentaire?

+0

Le code est commenté car c'est un moyen standard d'inclure Javascript dans le code Java GWT - pour que le compilateur Java soit content. – Domchi

+0

Merci Rafe. Le code est entre/* - {et} - */parce que GWT utilise Java mais vous permet d'inclure le javascript natif en l'entourant de/* - {et} - */ Je vais examiner explicitement chaque processus. – Miguel

+0

Ça explique beaucoup. J'étais sur le point d'avoir un "bien il y a ton problème!" moment. –

0

JavaScript sur le web est single thread, sauf si vous utilisez worker threads (autour depuis Firefox 3.5). C'est juste comment le web est conçu pour fonctionner, et tous les navigateurs vont faire les choses de la même manière.

+0

Vous pouvez également simuler des trames de travail en utilisant setTimeout. –

+0

Oui, mais je ne pense pas que cela aiderait dans ce cas. Si le script prend déjà une minute pour s'exécuter, il va quand même bloquer votre page Web un peu. – sdwilsh

2

Vous pouvez utiliser HTML5 avec du JavaScript multithread par l'intermédiaire de travailleurs Web. Vérifiez d'abord si votre navigateur le supporte.

function supports_web_workers() { 
    return !!window.Worker; 
} 

Puis commencez à utiliser multithreading. Je n'ai jamais essayé cela moi-même alors corrigez-moi si je me trompe.

+0

Je vais devoir chercher ceci et voir comment cela fonctionne ... –

+0

Merci Stephan! Je vais essayer. – Miguel

+0

Je serai intéressé par vos résultats, Miguel. – nottinhill

0

Votre question est un peu incorrecte parce que vous n'utilisez pas xhr comme vous pouvez le penser mais injections de script (jsonp). Dans ce cas, Firefox télécharge les fichiers en parallèle mais exécute le fichier dans l'ordre dans lequel les fichiers ont été envoyés au DOM.

Questions connexes