IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AJAX Discussion :

Sortir une variable d'un appel ajax


Sujet :

AJAX

  1. #1
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 134
    Points : 78
    Points
    78
    Par défaut Sortir une variable d'un appel ajax
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    function getLayers(){
     
      var bounds = map.getBounds();
      var bn = bounds._ne.lat;
      var be = bounds._ne.lng;
      var bs = bounds._sw.lat;
      var bw = bounds._sw.lng;
     
      var baselayers = [];
     
      $.ajax({
        url: API_LAYERS+'api/layer/intersects.php?',
        type:'GET',
        datatype:'json',
        data:{
          "bw":bw,
          "bs":bs,
          "be":be,
          "bn":bn
        },
        complete: function(res) {
          if (checkAjaxError(res)) {
            var layer_res = res.responseJSON;
            var layer_record = layer_res.layer;
     
            for(i=0;i<layer_record.length;i++)
            {
     
            var record = layer_record[i];
           //  console.log(record['id_flux']);
     
            var layer_item = {
              id: record['id_flux'],
              tiles: record['url'],
              name: record['layername'],
              sourceExtraParams: {
                tileSize: 256,
                attribution: record['layername'],
                minzoom: 0,
                maxzoom: 22
              }
            };
     
            baselayers.push(layer_item);
     
          }
        }
     
      }
    })
     
    return baselayers; //ici un console.log renvoie un tableau (celui que je cherche)
     
    }
     
    map.on('idle', function(){
      getLayers();
     
      console.log(getLayers()); // ce console.log me renvoie aussi mon tableau
     
      var basemapscontrol = new MaplibreGLBasemapsControl( // normalement, le tableau étant bien formé, il devrait afficher le module comme dans la démo, mais c'est pas le cas
        {
          basemaps: getLayers(),
          initialBasemap: "OpenStreetMap",
          expandDirection: "top"
        }); 
     
        map.addControl(basemapscontrol, 'bottom-right');
     
    })

    Je travaille sur ce code. Il s'agit d'un module Mapbox qui permet d'afficher des couches sous forme d'un switcher. Il s'agit du module MapLibreGLBasemapsControl.

    Voila une démo : https://ka7eh.github.io/maplibre-gl-basemaps/example

    Ce module est appelé de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    map.addControl(basemaps, 'bottom-right');
    basemaps est un tableau constitué d'élément comme ceux-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
          id: "OpenTopoMap",
              tiles: ["https://tile.opentopomap.org/{z}/{x}/{y}.png"],
              name: 'OpenTopoMap',
              sourceExtraParams: {
                tileSize: 256,
                attribution: "OpenTopoMap",
                minzoom: 0,
                maxzoom: 22
              }
            },
    Mes données proviennent d'une base de données dans laquelle est référencée des fonds de carte (IGN, OpenStreetMap, SwissTopo etc.).

    J'ai une application côté front avec une carte et je cherche avec la fonction getLayers() à n'afficher que les fonds de carte qui sont dans le canevas de carte. Ainsi, un utilisateur qui est en Suisse n'aura pas le fond de carte "Catalogne" suggéré. Ce qui est bcp plus confort.

    N'arrive correctement à avoir un tableau ligne 52 et 59. Seulement, je n'arrive pas à afficher le module comme présenté dans la démo. Pourquoi ?
    Merci pour vos retours,

    Sylvain

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    la réponse de la requête http se fait de façon asynchrone donc les données sont seulement disponibles dans la partie "complete".

    donc vous devez faire quelque chose comme cela :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    $.ajax({
        url: API_LAYERS+'api/layer/intersects.php?',
        type:'GET',
        datatype:'json',
        data:{
          "bw":bw,
          "bs":bs,
          "be":be,
          "bn":bn
        },
        complete: function (res) {
     
    		var baselayers = [];
     
     
    		if (checkAjaxError(res)) {
    			var layer_res = res.responseJSON;
    			var layer_record = layer_res.layer;
     
    			for(i=0;i<layer_record.length;i++)
    			{
     
    				var record = layer_record[i];
    			//  console.log(record['id_flux']);
     
    				var layer_item = {
    					id: record['id_flux'],
    					tiles: record['url'],
    					name: record['layername'],
    					sourceExtraParams: {
    						tileSize: 256,
    						attribution: record['layername'],
    						minzoom: 0,
    						maxzoom: 22
    					}
    				};
     
    				baselayers.push(layer_item);
     
    			}
    		}
     
     
    		mise_en_place_calques(baselayers);
     
    	}
    );
     
     
    function mise_en_place_calques(baselayers)
    {
     
    	var basemapscontrol = new MaplibreGLBasemapsControl({
    		basemaps: baselayers,
    		initialBasemap: "OpenStreetMap",
    		expandDirection: "top"
    	});
     
        map.addControl(basemapscontrol, 'bottom-right');
     
    }

  3. #3
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 134
    Points : 78
    Points
    78
    Par défaut
    Bonjour,

    La solution a été d'utiliser success plutôt que complete, et surtout d'ajouter async = false avant ce success.

    Bonne journée

    Sylvain

  4. #4
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Bonjour,
    je trouve cela moyen le passage par async="false", mais bon ...
    De plus il est à noter que :
    Citation Envoyé par jQuery
    Deprecation Notice: The jqXHR.success(), jqXHR.error(), and jqXHR.complete() callbacks are removed as of jQuery 3.0.
    You can use jqXHR.done(), jqXHR.fail(), and jqXHR.always() instead.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 05/07/2008, 19h09
  2. Sortir une variable d'une fonction JS.
    Par xplose dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 13/08/2007, 09h10
  3. Réponses: 4
    Dernier message: 28/07/2007, 23h45
  4. [AJAX] Passage d'une variable très longue avec AJAX
    Par Figaro83 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 18/09/2006, 16h53
  5. Réponses: 2
    Dernier message: 23/10/2005, 18h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo