Partage

[NODEJS] Return undefined ? Callback ?

Sujet résolu
3 janvier 2018 à 14:49:48

Bonjour,

Me voici à nouveau... Je travaille sur NODEJS avec des Sockets.

function openBox(name) {
	  getBoxItems(name).then(function(result) {
		var items = result;
		var directory = null;
		if (items != null) {
		  for (var i = 0; i < items.length; i++) {
  			if (directory == null) {
  			  directory = [];
  			}
  			for (var j = 0; j < items[i].amount; j++) {
  			  directory.push(items[i].id_item);
  			}
		  }
		}
    console.log(directory[getRandom(0, directory.length)]);
		return directory[getRandom(0, directory.length)];
	  });
	}

J'ai cette fonction, qui fonctionne très bien car le resultat qui est dans return est un nombre que j'attends (Par exemple, int 4).

getBoxItems(name) est une fonction qui fait une requête mysql elle est donc promise c'est pour cela que j'utilise then ici.

Mon soucis vient quand je souhaite appeller cette fonction ci-dessus.

  socket.on('box_open', function(message) {
    console.log(openBox(message));
  });

Il ne m'affiche pas dans la console le 4 mais "undefined". Alors j'ai fais de multiple recherche et si j'ai bien compris je dois faire une fonction de "callback". Je m'y suis appliqué en tentant de comprendre ce mécanisme.

  socket.on('box_open', function(message) {
    openBox(message, function(result){
      console.log(result);
    })
  });
	
function openBox(name, callback) {
  getBoxItems(name).then(function(result) {
    var items = result;
    var directory = null;
     if (items != null) {
     for (var i = 0; i < items.length; i++) {
      if (directory == null) {
       directory = [];
      }
      for (var j = 0; j < items[i].amount; j++) {
       directory.push(items[i].id_item);
       }
     }
    }
    console.log(directory[getRandom(0, directory.length)]);
    callback(directory[getRandom(0, directory.length)]);
 });
}

Le résultat est pourtant le même. Je ne sais plus où donner de la tête...

Bonne journée, merci pour vos futurs réponses.

Vous êtes demandeur d'emploi ?
Sans diplôme post-bac ?

Devenez Développeur web junior

Je postule
Formation
en ligne
Financée
à 100%
3 janvier 2018 à 14:58:43

Bonjour,

Tu te compliques la vie, le callback n'est pas necessaire,

si ton result est undefined, cela veut dire que: getRandom(0, directory.length) est un nombre plus grand que directory.length - 1 ou plus petit que 0

Si vous voulez me mp, venez sur Discord (username: Stelyus#8984)
3 janvier 2018 à 15:10:59

Stelyus a écrit:

Bonjour,

Tu te compliques la vie, le callback n'est pas necessaire,

si ton result est undefined, cela veut dire que: getRandom(0, directory.length) est un nombre plus grand que directory.length - 1 ou plus petit que 0

Merci pour ta réponse, si tu parles de cette ligne.

return directory[getRandom(0, directory.length - 1)];

(Effectivement, il y a quelque chose à rectifier mais) ce n'est pas mon problème car elle donne 4 comme je l'ai dis

http://prntscr.com/hvjcgr

Dans cette image, on vois qu'il est censé retourné 1 mais dans mon socket il me retourne undefined...



-
Edité par Shidoo 3 janvier 2018 à 15:11:33

3 janvier 2018 à 15:15:44

Humm,

attend je me suis enfaite probablement trompé, j'ai mal lu ta fonction, ton probleme vient de ta promesse grosso modo ta fonction ne fait rien car elle appelle ta promesse mais pendant que ta promesse est en train d'etre traite, la fonction continue a etre executé et du coup te retourne rien

-
Edité par Stelyus 3 janvier 2018 à 15:17:10

Si vous voulez me mp, venez sur Discord (username: Stelyus#8984)
3 janvier 2018 à 15:18:01

Okey...

C'est pour cela que j'ai pensé à un callback mais il semblerait que c'est pas ça :x

Mais je ne peux pas rajouter un then là-bas dedans non ?

(Edit)

Ok, j'ai finalement trouvé en cognant sec ma cervelle.

J'ai du faire une deuxième promesse, ce n'est pas quelque chose de "très" lourd pour mon code ?

-
Edité par Shidoo 3 janvier 2018 à 15:29:55

3 janvier 2018 à 15:30:45

Tu peux retourner ta promesse et l'avoir dans ton box_open cad

function openBox(name) {
      return getBoxItems(name).then(function(result) {
        var items = result;
        var directory = null;
        if (items != null) {
          for (var i = 0; i < items.length; i++) {
            if (directory == null) {
              directory = [];
            }
            for (var j = 0; j < items[i].amount; j++) {
              directory.push(items[i].id_item);
            }
          }
        }
    console.log(directory[getRandom(0, directory.length)]);
        return directory[getRandom(0, directory.length)];
      });
    }

Puis dans ton box_open:

socket.on('box_open', function(message) {
  openBox(message).then(function (value) {
        console.log(value)
  });

   //  attention ici value ne sera pas defini
});
Si vous voulez me mp, venez sur Discord (username: Stelyus#8984)
3 janvier 2018 à 15:50:46

Ok merci beaucoup pour ta précieuse aide

Bonne journée :)

-
Edité par Shidoo 3 janvier 2018 à 15:51:25

[NODEJS] Return undefined ? Callback ?

× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
  • Editeur
  • Markdown