Comment faire synchrone JSONP crossdomain appel

Je me suis coincé avec synchrone crossdomain appel.

Plus tôt dans mon application, nous étions en train de domaine, alors il n'y a pas de problèmes

Mon précédent code javascript pour faire appel, en tant que ci-dessous:

function EKXMLProvider(oDropdown, sDefault, sXML, sFilterUrl, fireRequestOnce)
{
var oXMLHTTP, i, length, oData, sValue, sDisplay, sName, sMatch, oRegExp;
if (!oDropdown)
return;
//XMLHTTP Object to retrieve the xml document
oXMLHTTP = this.createXMLHttpRequest();
this.FilterUrl = sFilterUrl;
if (sFilterUrl != previousFilterUrl){
oXMLHTTP.open("GET", sFilterUrl, false);
oXMLHTTP.send(null);
sFilterData = oXMLHTTP.responseText
previousFilterUrl = sFilterUrl;
}
if(!fireRequestOnce ||(fireRequestOnce && retrievedData == null))
{
this.documentUrl = sXML;
oXMLHTTP.open("GET", this.documentUrl, false);
oXMLHTTP.send(null);
oData = oXMLHTTP.responseXML.documentElement.childNodes;
if(fireRequestOnce)
retrievedData = oData;
}
else if(retrievedData != null)
{
oData = retrievedData;
}
this.suggestData = new Array();
//Filter out all 2 and 3 letter codes (airport, city, country)
oRegExp = new RegExp("\\s+\\(\\w{2,3}\\)", "gi");
var iCount = 0    
for (i = 0, length = oData.length; i < length; i++)
{
sValue = oData[i].attributes.getNamedItem("v").value;
sDisplay = oData[i].attributes.getNamedItem("d").value;
sName = oData[i].attributes.getNamedItem("n").value;
//sMatch = oData[i].attributes.getNamedItem("m").value;
sMatch = oData[i].attributes.getNamedItem("e").value;
if (sFilterData.search(sValue) != -1){
this.suggestData[iCount] = new EKSuggestData(sName + " (" + sValue + ")", sDisplay, sValue, sMatch, sMatch.replace(oRegExp, ""));
iCount++;
}
}
//Call the inherited class
EKSuggestProvider.call(this, oDropdown, sDefault);
}

Maintenant que nous avons déménagé nos appels d'autre domaine, nous avons besoin de faire crossdomain appels, j'ai changé le code ci-dessus pour crossdomain comme ci-dessous:

function EKXMLProvider(oDropdown, sDefault, sXML, sFilterUrl, fireRequestOnce)
{
var oXMLHTTP, i, length, oData, sValue, sDisplay, sName, sMatch, oRegExp;
var qr = "&jsonpcall=true";
if (!oDropdown)
return;
//XMLHTTP Object to retrieve the xml document
oXMLHTTP = this.createXMLHttpRequest();
this.FilterUrl = sFilterUrl;
if (sFilterUrl != previousFilterUrl){
//alert(sFilterUrl);
//oXMLHTTP.open("GET", sFilterUrl, false);
//oXMLHTTP.send(null);
//sFilterData = oXMLHTTP.responseText
//queue up an ajax request
$.ajax({
url: sFilterUrl + qr,
type: "GET",
cache: true,
async:false,
contentType: "application/javascript; charset=utf-8",
dataType: "jsonp",
jsonpCallback: "airport", 
success: function(data, textStatus, jqXHR) 
{               
if (data.airport[0] != '')
{
sFilterData = data.airport[0];
} 
}
});
previousFilterUrl = sFilterUrl;        
}
if(!fireRequestOnce ||(fireRequestOnce && retrievedData == null))
{
//alert(sXML);
this.documentUrl = sXML;
//oXMLHTTP.open("GET", this.documentUrl, false);
//oXMLHTTP.send(null);
//queue up an ajax request
$.ajax({
url: sXML + qr,
type: "GET",
async:false,
cache: true,
contentType: "application/javascript; charset=utf-8",
dataType: "jsonp",
jsonpCallback: "airportxml", 
success: function(data, textStatus, jqXHR) 
{                 
var xmlDoc = $.parseXML(data.myresult);
oData = xmlDoc.documentElement.childNodes; 
alert(oData);
}
});
//oData = oXMLHTTP.responseXML.documentElement.childNodes;
if(fireRequestOnce)
retrievedData = oData;
}
else if(retrievedData != null)
{
oData = retrievedData;
}
this.suggestData = new Array();
//Filter out all 2 and 3 letter codes (airport, city, country)
oRegExp = new RegExp("\\s+\\(\\w{2,3}\\)", "gi");
var iCount = 0    
for (i = 0, length = oData.length; i < length; i++)
{
sValue = oData[i].attributes.getNamedItem("v").value;
sDisplay = oData[i].attributes.getNamedItem("d").value;
sName = oData[i].attributes.getNamedItem("n").value;
//sMatch = oData[i].attributes.getNamedItem("m").value;
sMatch = oData[i].attributes.getNamedItem("e").value;
if (sFilterData.search(sValue) != -1){
this.suggestData[iCount] = new EKSuggestData(sName + " (" + sValue + ")", sDisplay, sValue, sMatch, sMatch.replace(oRegExp, ""));
iCount++;
}
}
//Call the inherited class
EKSuggestProvider.call(this, oDropdown, sDefault);
}

Au-dessus de Jquery modifications fonctionnent très bien quand j'ai mis "async:false," à mon appel, mais, par ma connaissance nous n'avons pas d'appel synchrone dans le domaine de la croix et si je change pour "async:true," l'appel commence à donner de l'erreur sur la ligne ( for (i = 0, length = oData.length; i < length; i++)) Odata des besoins à pourvoir sur la deuxième "airportxml" et il semble à la fois les appels sont dépendantes les unes des autres, de sorte que chaque fois que premier appel est de l'envoyer simultanément va pour le prochain appel.

J'ai utilisé ajaxQueue pour cela aussi, mais pas de chance.

Veuillez indiquer quels sont les changements que je dois faire.

Vous pouvez déplacer ce code pour un rappel.. votre constructeur n'beaucoup trop de travail réel, il faut juste construire et d'initialiser un objet
pouvez-vous s'il vous plaît vider plus, tout échantillon lien ou le code

OriginalL'auteur Manoj Singh | 2012-05-28