Come si fa a fare lo script attesa per lo stato di una richiesta di Ajax ottenere prima di continuare?
Domanda
In pratica quello che sto facendo è verificare l'esistenza di un oggetto, se non è trovato, lo script cercherà di caricare il file di origine utilizzando getScript. Voglio solo controllare questo una volta però poi tornare vero o falso per la funzione che chiama fetch ()
fetch:function(obj){
...
isReady = false;
$.getScript(obj.srcFile,function(){
isReady=true;
warn("was able to load object "+key);
});
return isReady;
}
ma tornare calci prima che lo script carichi = /
dopo lo script viene caricato ma la funzione restituito falso.
Questa è la bellezza di asincrona suppongo ...
Qual è il modo migliore per gestire questo ... Forse ho potuto verificare di nuovo in qualche altro punto, se l'oggetto esiste?
O forse c'è un modo migliore per fare questo, dove non devo potenzialmente bloccare il browser?
Soluzione
Da l'organizzazione del codice sto indovinando che si sta utilizzando un oggetto per contenere i vostri metodi. Se è così allora si potrebbe utilizzare eventi personalizzati come questo:
var thing = {
fetch: function(obj){
var self = this;
if (obj.isReady){
self.trigger('ready', [obj]);
return;
}
$.getScript(obj.srcFile,function(){
obj.isReady = true;
self.trigger('ready', [obj]);
});
}
};
thing.bind('ready',function(e, obj){
// do what you need to do when the object exists here
});
var obj = {};
thing.fetch(obj);
Altri suggerimenti
jQuery.ajax () :. Fare async
false
Per impostazione predefinita, tutte le richieste vengono inviate asincrona (cioè questa è impostata su true per impostazione predefinita). Se avete bisogno di richieste sincrone, impostare questa opzione a false. Si noti che le richieste sincrone possono bloccare temporaneamente il browser, disabilitando tutte le azioni, mentre la richiesta è attiva.
fetch:function(obj){
isReady = false;
$.getScript(obj.srcFile,function(script_data){
isReady=true;
warn("was able to load object "+key);
if ( typeof( script_data ) != 'undefined' ) {
return isReady;
}
});
}
È necessario restituire il valore all'interno della funzione di callback, altrimenti si avvia la richiesta per poi tornare subito.