web-dev-qa-db-fra.com

Appelez plusieurs données/fichiers JSON en une seule requête getJson

J'ai ce code:

var graphicDataUrl = 'templating/graphic-data.json';
var webDataUrl = 'templating/web-data.json';
var templateHtml = 'templating/templating.html';
var viewG = $('#view-graphic');
var viewW = $('#view-web');

$.getJSON(dataUrls, function(data) {
    $.get(templateHtml, function(template) {
        template = Handlebars.compile(template);
        var example = template({ works: data });        
        viewG.html(example);
        viewW.html(example);
    }); 
});

Quel est le meilleur moyen d'appeler les deux JSON dataUrl et d'utiliser leurs données afin de les afficher dans deux div différents (#viewW et #viewW) sur ma page?

11
Giorgia Sambrotta

Le meilleur moyen est de les traiter individuellement et de gérer les conditions d'erreur:

$.getJSON(graphicDataUrl)
    .then(function(data) {
        // ...worked, put it in #view-graphic
    })
    .fail(function() {
        // ...didn't work, handle it
    });
$.getJSON(webDataUrl, function(data) {
    .then(function(data) {
        // ...worked, put it in #view-web
    })
    .fail(function() {
        // ...didn't work, handle it
    });

Cela permet aux demandes de se dérouler en parallèle et met à jour la page dès que possible à la fin de chaque demande.

Si vous voulez exécuter les requêtes en parallèle mais que wait pour mettre à jour la page jusqu'à ce qu'elles both soient terminées, vous pouvez le faire avec $.when :

var graphicData, webData;
$.when(
    $.getJSON(graphicDataUrl, function(data) {
        graphicData = data;
    }),
    $.getJSON(webDataUrl, function(data) {
        webData = data;
    })
).then(function() {
    if (graphicData) {
        // Worked, put graphicData in #view-graphic
    }
    else {
        // Request for graphic data didn't work, handle it
    }
    if (webData) {
        // Worked, put webData in #view-web
    }
    else {
        // Request for web data didn't work, handle it
    }
});

... mais la page peut sembler moins sensible, car vous ne mettez pas à jour la première demande, mais seulement lorsque les deux le font.

28
T.J. Crowder

Juste au cas où cela serait utile à quelqu'un d’autre qui pourrait rencontrer cela - et grâce aux avancées de Promise dans jQuery - T.J. La réponse de Crowder peut maintenant être améliorée en une fonction succincte et générale:

/**
 * Load multiple JSON files.
 *
 * Example usage:
 *
 * jQuery.getMultipleJSON('file1.json', 'file2.json')
 *   .fail(function(jqxhr, textStatus, error){})
 *   .done(function(file1, file2){})
 * ;
 */
jQuery.getMultipleJSON = function(){
  return jQuery.when.apply(jQuery, jQuery.map(arguments, function(jsonfile){
    return jQuery.getJSON(jsonfile);
  })).then(function(){
    var def = jQuery.Deferred();
    return def.resolve.apply(def, jQuery.map(arguments, function(response){
      return response[0];
    }));
  });
};

Cependant, il est judicieux de ne donner aucun retour à l'utilisateur - en attendant le chargement complet. Donc, pour ceux qui préfèrent donner un feedback réactif, voici une version légèrement plus compliquée qui permet de progresser.

/**
 * Load multiple json files, with progress.
 *
 * Example usage:
 *
 * jQuery.getMultipleJSON('file1.json', 'file2.json')
 *   .progress(function(percent, count, total){})
 *   .fail(function(jqxhr, textStatus, error){})
 *   .done(function(file1, file2){})
 * ;
 */
jQuery.getMultipleJSON = function(){
  var 
    num = 0,
    def = jQuery.Deferred(),
    map = jQuery.map(arguments, function(jsonfile){
      return jQuery.getJSON(jsonfile).then(function(){
        def.notify(1/map.length * ++num, num, map.length);
        return arguments;
      });
    })
  ;
  jQuery.when.apply(jQuery, map)
    .fail(function(){ def.rejectWith(def, arguments); })
    .done(function(){
      def.resolveWith(def, jQuery.map(arguments, function(response){
        return response[0];
      }));
    })
  ;
  return def;
};
12
Pebbl

Ce code est simple et vous pouvez accéder aux deux réponses en une seule fonction:

$.when(
    $.getJSON(graphicDataUrl),
    $.getJSON(webDataUrl)
).done(function(data1, data2) {
    console.log(data1[0]);
    console.log(data2[0]);
});
0
Nabi K.A.Z.