Utilizzando $ .post all'interno di una funzione JavaScript, non è possibile assegnare un valore a una variabile?

StackOverflow https://stackoverflow.com/questions/824431

  •  05-07-2019
  •  | 
  •  

Domanda

Sto cercando di utilizzare $ .post all'interno di una funzione, ottenere i risultati, quindi restituire la funzione vera o falsa in base ai risultati del callback $ .post. Tuttavia, sembra che si verifichi la richiamata, DOPO l'evento di ritorno della funzione genitore.

Ecco il codice corrente la variabile ret è sempre indefinita, ma se lo avverto () all'interno del callback $ .post, restituisce il risultato corretto;

function elementExists(key, type, path, appid, pid){
    var ret;
    $.post('?do=elExists', {key: key, type: type, path: path, appid: appid, pid: pid},function(data){
        ret = data;                         
    });

    alert(ret);
    return ret;

}
È stato utile?

Soluzione

Come hai scoperto, il post è fatto in modo asincrono. Se vuoi che sia sincrono, dovrai utilizzare ajax e imposta il parametro async su false. Sarebbe meglio, tuttavia, riconoscere che il post è asincrono e creare il codice in modo che l'azione eseguita dal callback sia indipendente dal metodo che invoca il post. Ovviamente, vuoi davvero fare qualcosa di diverso dall'allerta, ma senza sapere che cosa è difficile consigliarti su come effettuare il refactoring.

MODIFICA : capisco che il tuo codice sta verificando se esiste qualcosa, ma lo sta verificando per uno scopo. Se sapessimo quale fosse lo scopo, allora potrebbe essere possibile raccomandare come realizzarlo nel callback in modo che il metodo possa essere refactored.

Altri suggerimenti

function elementExists(key, type, path, appid, pid){
        $.post('?do=elExists', {key: key, type: type, path: path, appid: appid, pid: pid},function(data){
           alert(data);
        });
  }

la funzione (dati) è una richiamata (asincrona) che non puoi restituire valori del genere.

che il callback non viene chiamato fino a quando la pagina non viene terminata, ma il tuo " return ret " viene eseguito immediatamente dopo aver chiamato $ .post

Se si desidera impostarlo sincrono impostare async: false

Vedi i documenti http://docs.jquery.com/Ajax/jQuery.post#urldatacallbacktype

Il problema è che il codice viene eseguito in modo asincrono. Questo è l'avviso (ret) effettivamente chiamato prima di ret = data, che si verifica quando la richiesta Ajax è completata.

Puoi rendere sincrone le tue chiamate ajax (non consigliate) utilizzando async opzione o ridisegna il codice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top