2009-12-09 11 views
1

Je lance un appel synchrone jQuery à ajax - avec le type de retour défini sur "json". Cependant, les données de retour reviennent sous la forme d'une chaîne. Y at-il quelque chose que je fais mal, ou est-il là pour convertir la chaîne en un objet?appel ajax synchrone via jquery string retour

var ajax_response = $.ajax({url:"ajx_services", async:false, type:"post", data:{method: "getItem", item_no: $(ctx).val()}, dataType:"json"}); 
var data = ajax_response.responseText; 

L'appel ajax travaille, comme je peux voir les résultats dans le débogueur, il est tout simplement que les données renvoyées est dans une chaîne.

Répondre

1

responseText sera toujours une chaîne. dans $ .ajax() ajouter une fonction de rappel 'succès' avec un paramètre et ce seront les données JSON.

$.ajax({ 
    -- other stuff -- 
    , success: function(data) 
    { 
     // do something with data 
    } 
}); 
1

C'est parce que .ajax $() retourne une XMLHttpRequest réelle .. dont responseText n'a pas de concept de JSON, etc.

Essayez ceci:

var data = (function() { 
    var ajaxResponse = ''; 
    $.ajax({url:"ajx_services", async:false, type:"post", data:{method: "getItem", item_no: $(ctx).val()}, success: function (data) { 
     ajaxResponse = data; 
    }, dataType:"json"}); 
    return ajaxResponse; 
}()); 

Depuis est défini dans la fermeture parent de la fonction définie dans l'appel ajax(), elle peut être définie sur l'objet JSON data fourni par la fonction success (qui est appelée lorsque la requête Ajax etes). Ensuite, est renvoyé par la fermeture parent, qui est ensuite affectée à la variable data externe.

Notez que cette possibilité de retourner immédiatement le modifié à partir du ajax() n'est possible que parce que la requête est synchrone. S'il était asynchrone, return ajaxResponse retournerait très probablement une chaîne vide.

+0

Merci! ... travaillé comme un champion; Je me méprenais à tort sur la fonction de succès avec l'async: false. – user228148

0

De cette façon devrait fonctionner, en utilisant la fonction eval:

var ajax_response = $.ajax({url:"ajx_services", async:false, type:"post", data:{method: "getItem", item_no: $(ctx).val()}, dataType:"json"}); 
ajax_response.onreadystatechange = xHandler; 

function xHandler() { 
    if (ajax_response.readyState == 4) { 
    var data = eval('(' + ajax_response.responseText + ')'); 
    } 
} 

Mais comme il a été dit, vous devez utiliser le rappel de succès jQuery, qui existe pour rendre votre vie plus facile.