Bonjour à tous,

je suis en train de m'essayer à node et je me retrouve devant un problème que je n'arrive pas à résoudre. Voici un de mes modules:

import NginxService from './NginxService'
import Git from 'nodegit'
import fs from 'fs'
import map from 'async/map';

export default {
    getSites (options,callback) {
        this.listSitesName({}, files => {
            map(files,this.parseSite, (err,sites) => {
                callback(sites)
            })
        })
        return true
    },
    parseSite (name, callback) {
        console.log(this) // undefined
    }
}

Comme vous le voyez, lorsque j'arrive dans la fonction parseSite(), le this est undefined, hors, j'aimerais utiliser d'autres fonctions de mon module dans cette fonction. Comment puis-je arriver à mes fins?

Merci pour votre aide!

2 réponses


Crée une class:

export default new class TaClass {
  ...
}()

Salut,
Je ne sais pas comment tu aimes programmer, soit tu restes en "orientée objet" avec du javascript ou alors tu pars doucement vers du fonctionnel.
En javascript le contexte de this change en fonction du contexte de l'appelant ce qui rend sa valeur "instable" (elle ne vaut pas toujours la même chose). Soit on est "fan" de l'orientée objet et on utilise les Class et s'expose à galérer avec this, ou alors à mettre des coup de this.function.bind(this) au niveau du constructeur...
Pour ma part toute la partie class/constructeur ect est source de problèmes.
Bref je ne m'étalerai pas là dessus, si tu souhaites plus d'informations à ce propos, il suffit de demander.

Tu pourrais avoir un système comme ceci :

const parseSite = (name, callback) => {   
}
const getSites = (options) => {
  // Verifie tes options, par exemple avec des options par défaut :
  const defaultOpts = { something: true }
  const state = Object.assign({}, defaultOpts, options) 
  const listSitesName = (object, callback) => { // Cette fonction sera privée à getSItes (rappel avec la syntaxe Class actuellement nous ne pouvons pas créer de méthode privée
      // List youy sites name
  }
  return {
    get (callback) {
        listSitesName({}, files => {
          map(files,parseSite, (err,sites) => {
              callback(sites)
          })
        return true
      })
    }
  }
}

export { getSites }

Si tu souhaites que j'explique comment la variablethis fonctionne n'hésite pas.