Não é possível obter o valor de retorno correto de uma chamada do jQuery Ajax

Isso deve retornar um object JSON contendo uma lista de nomes de arquivos de imagem. O alerta comentado mostra os dados corretos, mas alert(getPicsInFolder("testfolder")); mostra "error" .

 function getPicsInFolder(folder) { return_data = "error"; $.get("getpics.php?folder=" + folder, function (data) { data = jQuery.parseJSON(data); $.each(data, function (index, value) { data[index] = "folders/" + folder + "/" + value; }); //alert(data); // This alert shows the correct data, but that's hardly helpful return_data = data; }); return return_data; } 

O que estou fazendo de errado?

    Você está chamando o método $.get() asynchronous, onde sua function de retorno de chamada será chamada depois que sua function getPicsInFolder() retornar. Siga os comentários no exemplo abaixo:

     function getPicsInFolder(folder) { return_data = "error"; // Since the $.get() method is using the asynchronous XMLHttpRequest, it // will not block execution, and will return immediately after it is called, // without waiting for the server to respond. $.get("getpics.php", function (data) { // The code here will be executed only when the server returns // a response to the "getpics.php" request. This may happen several // milliseconds after $.get() is called. return_data = data; }); // This part will be reached before the server responds to the asynchronous // request above. Therefore the getPicsInFolder() function returns "error". return return_data; } 

    Você deve considerar refatorar seu código de forma que a lógica para manipular o object JSON esteja no retorno de chamada $.get() . Exemplo:

     $.get("getpics.php?folder=test", function (data) { // Handle your JSON data in here, or call a helper function that // can handle it: handleMyJSON(data); // your helper function }); 

    Você está recebendo os dados de forma assíncrona. A function de function (data) {} retorno de chamada function (data) {} é chamada depois que getPicsInFolder retorna.

    Você tem duas opções:

    1. (a opção ruim): configure sua chamada ajax para ser síncrona.

    2. (a opção certa): reestruture seu código, para que qualquer coisa que precise acontecer com os dados de retorno ocorra no retorno de chamada.

    Uma maneira de fazer isso seria passar um retorno de chamada para getPicsInFolder , assim:

     function getPicsInFolder(folder, callback) { return_data = "error"; $.get("getpics.php?folder=" + folder, function (data) { data = jQuery.parseJSON(data); $.each(data, function (index, value) { data[index] = "folders/" + folder + "/" + value; }); callback(data); //pass data into the callback function }); 

    Então, quando você chamar seu getPicsInFolder, em vez de fazer:

     pics = getPicsInFolder('foldername'); //do something with pics 

    faça isso:

     getPicsInFolder('foldername', function (pics) { //do something with pics }); 

    As solicitações de AJAX devem ser assíncronas (você pode fazer as síncronas ao custo de interromper a execução e, com efeito, bloquear sua interface do usuário).

    getPicsInFolder() está retornando antes que a solicitação do AJAX seja concluída. Você precisa atualizar sua UI / manipular o object JSON retornado no evento complete (a function anônima que você está passando como um argumento para $.get() ):

     $.get("", function () { // This anonymous function will execute once the request has been completed // Update your UI/handle your data here }); 

    Digamos que eu queira atualizar um elemento na minha interface do usuário …

     $("#ID-of-a-button-in-the-UI").click(function () // executes on click { $.get("url-to-JSON-object", function (json) // executes on request complete { $("#ID-of-element-to-update").html(json.rows[0].key); // updates UI }); }); 

    Você está confuso sobre como o AJAX funciona. Os dados não estão disponíveis até que a solicitação seja concluída, o que acontece após a function ter retornado. E os dados só estão disponíveis no retorno de chamada.