39 votes

Existe-t-il une version de $getJSON qui n'utilise pas de rappel ?

J'implémente un callback pour une bibliothèque javascript tierce et je dois retourner la valeur, mais je dois obtenir la valeur du serveur. J'ai besoin de faire quelque chose comme ceci :

3rdPartyObject.getCustomValue = function {
   return $.getJSON('myUrl');
}

getJson utilise XMLHttpRequest qui (je crois) a un comportement synchrone et asynchrone, puis-je utiliser le comportement synchrone ?

103voto

Paolo Bergantino Points 199336

En regardant le code source de jQuery, on constate que c'est tout $.getJSON fait :

getJSON: function( url, data, callback ) {
    return jQuery.get(url, data, callback, "json");
},

Et c'est tout $.get fait :

get: function( url, data, callback, type ) {
    // shift arguments if data argument was ommited
    if ( jQuery.isFunction( data ) ) {
        callback = data;
        data = null;
    }

    return jQuery.ajax({
        type: "GET",
        url: url,
        data: data,
        success: callback,
        dataType: type
    });
},

Il n'y a pas de magie noire. Puisque vous avez besoin de personnaliser des choses autres que les éléments de base $.getJSON vous pouvez simplement utiliser la fonction de bas niveau $.ajax et passer la fonction option asynchrone comme faux :

$.ajax({
    type: 'GET',
    url: 'whatever',
    dataType: 'json',
    success: function() { },
    data: {},
    async: false
});

15voto

Jonathan Points 131

Vous pouvez également utiliser les éléments suivants avant de passer votre appel :

$.ajaxSetup( { "async": false } );

Je ne connais pas la portée de la propriété "async", je soupçonne qu'il s'agit d'une configuration globale. Réfléchissez donc à la possibilité de remettre cette propriété à true après votre appel synchrone.

exemple :

3rdPartyObject.getCustomValue = function { 
    $.ajaxSetup( { "async": false } );
    var result = $.getJSON('myUrl');
    $.ajaxSetup( { "async": true } );
    return result;
}

7voto

ph1g Points 51
var jsonObjectInstance = $.parseJSON(
    $.ajax(
        {
           url: "json_data_plz.cgi", 
           async: false, 
           dataType: 'json'
        }
    ).responseText
);

3voto

Mais sauf erreur de ma part, ce code ne fonctionnerait pas :

3rdPartyObject.getCustomValue = function {
  var json = $.ajax({
    type: 'GET',
    url: 'whatever',
    dataType: 'json',
    success: function() { },
    data: {},
    async: false
  });

return json;
}

Comme $.ajax renvoie l'objet XHR et non l'objet json analysé.

Il faudrait plutôt faire quelque chose comme :

var jsonLoader = function(url){
    this.url = url;
    this.rawData = {};
    this.getRawData();
};

jsonLoader.prototype.getRawData = function(){

    var json = $.ajax({
        type: 'GET',
        url: this.url,
        dataType: 'json',
        success: this.getRawData(this),
        data: {},
        async: false
    });
};

jsonLoader.prototype. getRawData = function(self){
    return function(json){self.rawData = json;};
};

var loadMe = new jsonLoader("Data.json");
loadMe.rawData //has the parsed json object

En fait, il existe probablement un moyen plus efficace d'obtenir le même résultat.

2voto

Steve Sheldon Points 2398

Si quelqu'un doit faire ça dans rails, j'ai un moyen assez propre de le faire :

Configurez votre contrôleur comme ceci :

def my_ajax_action

    respond_to do |format|
      # if you use render, you won't need a view page, the ":json =>" part takes care of all 
      # the formatting
      format.json { render :json => @variable_containing_json }
    end

end

Configurer l'appel en Javascript

function doAjaxWork( ) {

    var ret;

    $.ajax({
        type: 'GET',
        url: '/controller/action/param',
        dataType: 'json',
        complete: function(response) {
           ret = eval('(' + response.responseText + ')');
        },
        async: false
    });

    return ret;
}

Bien sûr, ne faites pas ces trucs de synchronisation à moins d'y être obligé. Oh et pendant que je montre du javascript avec des urls dedans, jetez un oeil sur JSRoutes ... ça les rend vraiment propres.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X