Ik heb een JavaScript widget die standaard uitbreidingspunten biedt. Een daarvan is de beforecreate
functie. Deze moet false
teruggeven om te voorkomen dat een item wordt aangemaakt.
Ik'heb een Ajax call toegevoegd aan deze functie met behulp van 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);
});
}
Maar ik wil voorkomen dat mijn widget het item aanmaakt, dus ik zou false
moeten retourneren in de moeder-functie, niet in de callback. Is er een manier om een synchroon AJAX verzoek uit te voeren met jQuery of een andere in-browser API?
Uit de jQuery documentatie: je specificeert de asynchronous optie op false om een synchroon Ajax verzoek te krijgen. Dan kan je callback wat gegevens instellen voordat je moederfunctie verder gaat.
Hier's hoe je code eruit zou zien als je het zou veranderen zoals voorgesteld:
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
});
}
Je kunt de jQuery's Ajax setup in synchrone modus zetten door het aanroepen van
jQuery.ajaxSetup({async:false});
En voer dan je Ajax-aanroepen uit met jQuery.get( ... );
Dan gewoon weer een keer aanzetten
jQuery.ajaxSetup({async:true});
Ik denk dat het hetzelfde uitwerkt als voorgesteld door @Adam, maar het kan handig zijn voor iemand die wel zijn jQuery.get()
of jQuery.post()
wil herconfigureren naar de uitgebreidere jQuery.ajax()
syntax.
Uitstekende oplossing! Ik merkte toen ik het probeerde te implementeren dat als ik een waarde teruggaf in de succes clausule, het terugkwam als ongedefinieerd. Ik moest het opslaan in een variabele en die variabele teruggeven. Dit is de methode die ik bedacht heb:
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;
}