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

JavaScript Discussion :

Constructeur avec callback ?


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 155
    Par défaut Constructeur avec callback ?
    Bonjour

    C'est pour un problème de structure. Actuellement ça fonctionne, mais c'est plus pour comprendre et avancer dans le js 'objet' ...

    J'ai une fonction d'initialisation qui fonctionne avec des callbacks, et qui est résumée ci-dessous...
    Par exemple la fonction Run est appelée par un clic utilisateur, la fonction LoadScripts (url, callback) charge une BIBLIO dynamiquement et gère une jauge .. avant de fabriquer l'objet (theobject) à la fin.

    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
    Layout  =
    {
     
    	Init: function (parameters)
    	{
    		parameters = parameters || {};
     
    		var param = parameters.param;
    		var callback  = parameters.callback;
     
    		...
     
    		Run = function ()
    		{
    			...
     
    			Layout.LoadScripts
    			(
    				parameters.scripts,
     
    				function ()
    				{
    					...
     
    					var theobject = new BIBLIO.Construct (param)
     
    					parameters.callback (theobject, truc, much);
    				}
    			);
     
    		};
     
    		...
    	},
     
    	...
    },

    Dans la page index je suis obligé de l'appelle de cette façon :
    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
     
    var theobject;
    Layout.Init 
    ({
    	scripts:
    	{
    		main: 'https..BIBLIO.js', 
    		...
    	},
    	param: 'param',
    	callback: init
    });
    function init(back, truc, much)
    {
    	theobject = back;
    	...
    };

    J'aimerais savoir si il y a un moyen pour que ma fonction Init soit un vrai constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    var theobject = new Layout.Init 
    ({
    	scripts:
    	{
    		main: 'https..BIBLIO.js', 
    		...
    	},
    	param: 'param',
    	callback: init
    });
    function init(truc, much)
    {
    	...
    };
    Actuellement ce n'est évidemment pas possible puisque je ne sais pas où mettre un return, et qu'il n'est pas possible de lancer un callback et un return en même temps ...
    Y a t-il une autre structure possible pour ce genre de chose ?
    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Par défaut
    soit je n'ai pas compris soit il y a quelque chose d'illogique dans ta demande.

    un constructeur est une fonction qui avec l'aide de new fabrique un nouvel objet. un espèce d'initialisateur.

    new crée la référence memoire necessaire et le constructeur y place tout le necessaire (héritage init de membre etc)

    comment un constructeur peut-il être asynchrone ?
    tu voudrais que js fasse le new et attende la réponse pour préparer l'objet.
    Que devient la référence à cet objet avant qu'il soit initialisé. comment l'utiliser ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var a = new myConstructor();
    // utilisation de a alors que le constructeur attends le chargement de la lib pour executer la callback
    console.log(a.getValue());
    // losque le callback du constructeur arrive intialisation de a
    c'est une façon étrange de raisonner.

    A+JYT

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 155
    Par défaut
    tu voudrais que js fasse le new et attende la réponse pour préparer l'objet.
    En fait je voudrais que js attende la réponse pour faire le new puis lancer le callback, c'est ce qui se passe dans ma version actuelle.

    Que devient la référence à cet objet avant qu'il soit initialisé. comment l'utiliser ?
    Il ne peut être utilisé qu'après le callback.


    Le 2è appel que j'ai mis (var theobject = new Layout.Init ...) est illogique.
    Ma question est effectivement : y a t-il une façon de faire un constructeur asynchrone ?

    Ça ne me paraît pas aberrant en soi : avant que l'objet soit initialisé il n'existe pas, il n'existe qu'après le callback ..

  4. #4
    Expert confirmé
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Par défaut
    je te conseille de regarder du coté de RequireJS

    plutôt qu'un constructeur assynchrone il s'agit de mettre en place un systeme de chargement dynamique de js
    cela te permet via un appel d'indiquer à js que tu veux qu'un script js soit chargé avant que l'appel du constructeur soit effectué.
    du coup le constructeur est on ne peut plus normal.

    c'est le même genre de fonctionnement qui est utilisé dans sencha.
    A+JYT

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 155
    Par défaut
    Oui effectivement j'avais vu ça, j'avais même fait ma fonction 'LoadScripts' pour remplacer Require.js par qq chose de plus light (elle fait la même chose et jusqu'à présent elle a toujours marché), mais je vais regarder Require de plus près.

    J'ai pensé qu'il y avait des astuces js que je ne connaissais pas pour ça, mais peut être pas...

    Merci

  6. #6
    Expert confirmé
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Par défaut
    à partir du moment ou tu comment à introduire de l'assynchrone il te faut maitriser le moment ou les scripts sont exécuté.

    le moyen le plus simple est d'utiliser les événements.
    Dans requirejs tu fourni une callback à exécuter lorsque le script est chargé.

    mais on peu facilement amméliorer le principe. à la place d'une callback tu crée un nouvel événement. ainsi plus besoin de passer une callback au riquire il suffit d'avoir défini au préalable zero, un ou plusieurs handlers.

    en fait extjs et YUI fonctionnent ainsi.
    par exemple lorsque tu utilise un panel le require lance le chargement de Ext.panel.Panel.js lorsque le fichier est chargé l'événement "loaded"avec le nom du fichier est crée. le componant manager possède un handler sur cet événement il s'active et garde l'info comme quoi le fichier est chargé. le contenu du fichier est interprété et une "classe" (un prototype en réalité) est défini l'événement indiquant que la classe est crée est activé le componant manager sait alors qu'il peut créer pour toi l'instance. une succéssion d'événement seront ainsi créé tout au long de la vie du composant libre à toi de les utiliser ou pas
    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
    activate
    add
    added
    afterlayout
    afterrender
    beforeactivate
    beforeadd
    beforeclose
    beforecollapse
    beforedeactivate
    beforedestroy
    beforeexpand
    beforehide
    beforeremove
    beforerender
    beforeshow
    beforestaterestore
    beforestatesave
    blur
    boxready
    close
    collapse
    deactivate
    destroy
    disable
    dockedadd
    dockedremove
    enable
    expand
    float
    focus
    glyphchange
    hide
    iconchange
    iconclschange
    move
    remove
    removed
    render
    resize
    show
    staterestore
    statesave
    titlechange
    unfloat
    ce cette façon il n'est plus nécéssaire de fournir des callbaks lors de la définition de l'instance mais d'avoir prévu des handlers sur les élement qui t'intéresses.

    tu peux toi même expérimenter le principe en utilisant var event = new Event('myEventType'); et en utilisant vaddEventListener et dispachEventA+JYT

Discussions similaires

  1. [Perl Objet] Constructeur avec tableau en parametre
    Par crochepatte dans le forum Langage
    Réponses: 9
    Dernier message: 16/08/2006, 22h07
  2. Réponses: 14
    Dernier message: 02/08/2006, 18h37
  3. Réponses: 8
    Dernier message: 09/01/2006, 16h58
  4. [prog dynamique]Constructeur avec type primitif
    Par -=Spoon=- dans le forum Langage
    Réponses: 2
    Dernier message: 16/12/2004, 10h33
  5. Réponses: 7
    Dernier message: 30/09/2004, 12h55

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