Jeg har en JavaScript-widget som gir standard utvidelsespunkter. En av dem er beforecreate
-funksjonen. Den skal returnere false
for å hindre at et element blir opprettet.
Jeg har lagt til et Ajax-kall i denne funksjonen ved hjelp av jQuery:
beforecreate: function (node, targetNode, type, to) {
jQuery.get('http://example.com/catalog/create/' + targetNode.id + '?name=' + encode(to.inp[0].value),
function (result) {
if (result.isOk == false)
alert(result.message);
});
}
Men jeg vil forhindre at widgeten min oppretter elementet, så jeg bør returnere false
i moderfunksjonen, ikke i tilbakeringingen. Finnes det en måte å utføre en synkron AJAX-forespørsel ved hjelp av jQuery eller et annet API i nettleseren?
Fra jQuery-dokumentasjonen: du angir asynchronous-alternativet til å være false for å få en synkron Ajax-forespørsel. Da kan tilbakeringingen din angi noen data før moderfunksjonen din fortsetter.
Slik vil koden din se ut hvis den endres som foreslått:
beforecreate: function (node, targetNode, type, to) {
jQuery.ajax({
url: 'http://example.com/catalog/create/' + targetNode.id + '?name=' + encode(to.inp[0].value),
success: function (result) {
if (result.isOk == false) alert(result.message);
},
async: false
});
}
Du kan sette jQuery&# 39s Ajax-oppsett i synkron modus ved å kalle
jQuery.ajaxSetup({async:false});
Og utfør deretter Ajax-kallene dine ved hjelp av jQuery.get( ... );
Deretter er det bare å slå den på igjen en gang
jQuery.ajaxSetup({async:true});
Jeg antar det fungerer det samme som foreslått av @Adam, men det kan være nyttig for noen som ønsker å rekonfigurere sin jQuery.get()
eller jQuery.post()
til den mer forseggjorte jQuery.ajax()
syntaks.
Utmerket løsning! Jeg la merke til da jeg prøvde å implementere den at hvis jeg returnerte en verdi i suksessklausulen, kom den tilbake som udefinert. Jeg måtte lagre den i en variabel og returnere den variabelen. Dette er metoden jeg kom opp med:
function getWhatever() {
// strUrl is whatever URL you need to call
var strUrl = "", strReturn = "";
jQuery.ajax({
url: strUrl,
success: function(html) {
strReturn = html;
},
async:false
});
return strReturn;
}