2012-10-30 17 views
5

Non sono un professionista in JavaScript e ho visto la ricerca per un lungo periodo di tempo su Internet.JavaScript ottenere variabile dalla funzione

Sto riscontrando un problema nel ricevere una variabile da un'altra funzione. Il mio codice è alla ricerca in questo modo:

var variabeltje; 
$.post('js/ajax/handle_time.php', {'time': $(this).find('input').val()}, 
    function(data) { 
    alert(data); 
    variabeltje=data; 
    } 
); 
alert(window.variabeltje); 

La variabile variabeltje deve ottenere le informazioni dai dati. Quando inserisco l'avviso sotto variabeltje=data, funziona, ma ho bisogno della variabile di dati dopo la funzione.

Edit:

ho cambiato a quello che la gente ha detto, ora ho questo:

   var XHR = $.post('js/ajax/handle_time.php', {time: $(this).find('input').val()}); 
       XHR.done(function(data) { 
        console.log(data); 
        getData(data); 
       }); 

       function getData(data) { 
       if(data == 'true') { 
        alert(data); 
        $(this).unbind('keypress'); 
        $(this).html($(this).find('input').val()); 
       } 
       } 

Ma ora il $ (questo) non passa nella funzione. Come posso risolvere questo?

+0

Il motivo per cui segue, a risposte, ma nessuna soluzione di ciò che si sta cercando di fare. Questo perché è difficile farlo senza più un'idea di ciò che stai cercando di fare. Ad esempio, un buon modo per risolvere il problema in questo codice è spostare l'avviso su due righe, ma questo potrebbe non funzionare nel codice attuale. – Jasper

+0

Grazie per la risposta. Nel file handle_time.php sto verificando la convalida e sarà modificato nel database. Se viene modificato correttamente, restituirà true; E variabeltje deve ottenere il valore vero. Quindi, dopo l'avviso, voglio verificare se è vero o meno e mostrare o meno le cose. – Marnix

+0

Bene, allora suppongo che non dovresti provare a farlo sotto la chiamata '$ .post()' (che è subito dopo che la richiesta è * inviata *) Invece, dovresti farlo all'interno della funzione che passi a ' $ .post() 'che verrà eseguito al termine della richiesta. – Jasper

risposta

3

Come è asincrona i dati saranno disponibili solo dopo la chiamata AJAX è completata, quindi dovrete modificare il codice per lavorare con questo e aspettare fino a dopo l'Ajax è fatto per fare la tua roba:

var XHR = $.post('js/ajax/handle_time.php', {time: $(this).find('input').val()}); 

XHR.done(function(data) { 
    console.log(data); 
}); 

o in altra funzione:

function XHR(time){ 
    return $.post('js/ajax/handle_time.php', {time: time}); 
} 

function doStuff(element) { 
    XHR($(element).find('input').val()).done(function(data) { 
     console.log(data); 
    }); 
} 

EDIT:

base alla tua modifica, sembra che si tratta di un problema di scoping:

var self = this, 
    XHR = $.post('js/ajax/handle_time.php', {time: $(self).find('input').val()}); 

XHR.done(function(data) { 
    console.log(data); 
    getData(data); 
}); 

function getData(data) { 
    if(data == 'true') { //normally you'd try to pass true as a boolean, not string 
     alert(data); 
     $(self).unbind('keypress').html($(self).find('input').val()); 
    } 
} 
+0

Grazie mille. Ancora una domanda, quando inserisco questo nella funzione: $ (this) .html ($ (this) .find ('input').val()); Come faccio a passare $ (this) in XHR.done (funzione (dati) {? – Marnix

+0

È necessario capire l'ambito e cosa 'questo' è, quindi se necessario si utilizza una variabile o si passa a una funzione come faresti qualsiasi altra cosa davvero, per evitare problemi di scoping – adeneo

+0

Ho cambiato e ho modificato il primo post. – Marnix

1

Il problema è che il metodo post viene eseguito in modo asincrono. Questo è, un post viene inviato al server ma il flusso di esecuzione continua così il tuo avviso sta tentando di accedere a un valore che non è stato impostato poiché il post non è ancora stato restituito.

È possibile utilizzare il metodo ajax se è necessaria un'esecuzione sincronica.

2

Questo perché il metodo $ .post viene eseguito in modo asincrono.

Si prega di dare un'occhiata a this question su SO.

Modifica: è possibile modificare il codice e inserire il metodo post dopo post nel corpo della funzione anonima attivata in caso di successo. Come segue:

$.post('js/ajax/handle_time.php', {'time': $(this).find('input').val()}, 
    function(data) { 
    alert(data); 
    variabeltje=data; 
    alert(window.variabeltje); // or whatever function you need to call, call it here... 
    } 
); 
Problemi correlati