Ho un widget JavaScript che fornisce punti di estensione standard. Uno di questi è la funzione beforecreate
. Dovrebbe restituire false
per impedire la creazione di un elemento.
Ho aggiunto una chiamata Ajax in questa funzione usando 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);
});
}
Ma voglio impedire al mio widget di creare l'elemento, quindi dovrei restituire false
nella funzione madre, non nel callback. C'è un modo per eseguire una richiesta AJAX sincrona usando jQuery o qualsiasi altra API in-browser?
Dalla documentazione jQuery: si specifica che l'opzione asynchronous sia false per ottenere una richiesta Ajax sincrona. Poi il tuo callback può impostare alcuni dati prima che la tua funzione madre proceda.
Ecco come sarebbe il tuo codice se cambiato come suggerito:
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
});
}
Si può mettere la configurazione Ajax di jQuery in modalità sincrona chiamando
jQuery.ajaxSetup({async:false});
E poi eseguire le chiamate Ajax usando jQuery.get( ... );
Poi basta accenderlo di nuovo una volta
jQuery.ajaxSetup({async:true});
Credo che funzioni come suggerito da @Adam, ma potrebbe essere utile a qualcuno che vuole riconfigurare il suo jQuery.get()
o jQuery.post()
alla sintassi più elaborata jQuery.ajax()
.
Ottima soluzione! Ho notato, quando ho provato ad implementarla, che se restituivo un valore nella clausola di successo, questo tornava come indefinito. Ho dovuto memorizzarlo in una variabile e restituire quella variabile. Questo è il metodo che ho trovato:
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;
}