2009-03-10 14 views
3

J'ai un pageTest.html dans le dossier local, cette page appelez un service.ashx i = ... (cette valeur de retour incrémenté +1 param passé) avec le code Ajax suivre:Ajax callbacks synchrones

. 
. 
getIncr: function(parameters, success){ 
     $.ajax({ 
       async: false, 
       type: methodType, 
       url: getTarget, 
       data: "n="+parameters, 
       dataType:"jsonp", 
       success: success 
      }); 
    } 
. 
. 

l'appel page html cette fonction pour le temps m (avec le script ..):

.  
    var start = function(){ 
    . 
    . 
    var val = 0; 
    .  
    . 
    for(i=0; i<m; i++) 
    { 
     Foo.getIncr(val, function(returned_n){ 
      val = returned_n; 
     }); 

    } 

}; 

au cours du chargement de la page, les appels sont exécuter en mode "asynchrone" mais je réglage "async: false" à Ajax . J'ai lu à propos de ce problème et trouvé la raison, c'est Ajax ne peut pas synchroniser l'appel de page.html à service.ashx s'il existe dans un domaine différent. Existe-t-il une solution pour exécuter l'appel Synch dans page.html à ce service.ashx (dans un domaine différent)?

+3

Harsh, l'anglais n'est clairement pas la première langue de Domenico. Et je l'ai bien compris. –

+0

Je prends de l'aide à ce sujet dans n'importe quelle deuxième langue ... Thx Domenico! – Cody

Répondre

6

Eh bien, le problème est que vous ne pouvez pas faire des demandes synchrones JSONP. La façon dont il est mis en œuvre est, comme Andy l'a souligné, à travers un soi-disant "hack de balises de script". JQuery ne peut en aucun cas arrêter l'exécution de l'application javascript en attendant le remplissage d'une balise de script.

Vous appelez donc la bonne méthode de jQuery pour faire une requête JSONP mais parce que c'est JSONP, l'option asynchrone n'est pas appliquée et il n'y a aucun moyen de contourner le problème. Vous devez gérer la requête de manière asynchrone. D'un autre côté, il est déconseillé d'utiliser $ .ajax en mode synchrone de toute façon. Si la demande prend trop de temps à se terminer, le navigateur se bloque et il y a des chances que votre utilisateur obtienne une fenêtre indiquant que la page ne répond pas.

1

Vous ne pouvez pas utiliser XMLHttpRequest cross domain. Peu importe que ce soit synchrone ou asynchrone.

Étant donné que vous semblez utiliser JSON (et jsonp), vous devriez être en mesure d'obtenir ce que vous voulez avec le hack des balises de script. Je crois que jQuery a cette construit pour elle (est-ce que vous utilisez jQuery ailleurs?):

http://docs.jquery.com/Release:jQuery_1.2/Ajax#Cross-Domain_getJSON_.28using_JSONP.29

+0

thnks, je vais vérifier – Domenico