Return ne retourne rien

Résolu/Fermé
lamouchetsetse Messages postés 112 Date d'inscription samedi 2 août 2014 Statut Membre Dernière intervention 21 septembre 2021 - 3 sept. 2014 à 23:17
baladur13 Messages postés 46396 Date d'inscription mercredi 11 avril 2007 Statut Modérateur Dernière intervention 25 avril 2024 - 6 sept. 2014 à 11:28
Bonjour,
Mon return dans cette fonction ne me retourne rien:

var drop = function(e) 
{
     e.preventDefault();
     var files = e.dataTransfer.files,
    
    function f(file)
    {
          var reader = new FileReader();
          reader.onload = function()
          {
	       var read = this.result;
	       alert(read); // fonctionne bien
	       return read;
          };
          reader.readAsDataURL(file);
    }
                        
    for(var i=0; i<filesLength; i++) 
    {
          alert(f(files[i])); // fonctionne pas affiche undefined
    }
};


Donc la question:
pourquoi mon return ne retourne rien?
Merci de votre aide.

8 réponses

keurdange Messages postés 720 Date d'inscription lundi 8 novembre 2010 Statut Membre Dernière intervention 13 juillet 2016 231
4 sept. 2014 à 01:59
Bonjour,

C'est peut-être dû à la fonction alert.
Commente la et réessaye.
0
lamouchetsetse Messages postés 112 Date d'inscription samedi 2 août 2014 Statut Membre Dernière intervention 21 septembre 2021 2
4 sept. 2014 à 18:56
Bonjour keurdange, j'ai déjà essayé sans le alert().
0
Utilisateur anonyme
4 sept. 2014 à 08:51
Bonjour

La fonction f ne retourne rien. Le seul 'return' que je vois n'est pas dans f mais dans reader.onload : c'est donc tout à fait normal que alert(f(xxx)); ne sache pas quoi afficher
Je ne sais pas ce que tu cherches à faire, alors je n'ai pas de solution à te proposer.
Et tu as mal dû recopier ton script : ta ligne
var files = e.dataTransfer.files,
devrait se terminer par un point-virgule, pas par une virgule.
0
lamouchetsetse Messages postés 112 Date d'inscription samedi 2 août 2014 Statut Membre Dernière intervention 21 septembre 2021 2
4 sept. 2014 à 18:59
Bonjour le père effectivement mon return est dans reader.onload, mais reader.onloead est dans f().
Sinon, ce que je veux, c'est que ma fonction f() retourne la valeur de read.
0
lamouchetsetse Messages postés 112 Date d'inscription samedi 2 août 2014 Statut Membre Dernière intervention 21 septembre 2021 2
4 sept. 2014 à 21:10
Bon je suis pas sur qu'il soit possible de faire un return dans un évènement contenu dans un fonction.
Donc comment puis je retourner la valeur de read?
0
reader.onloead est dans f().
Aucun rapport.
Peu importe qu'on puisse lire le mot return entre le début et la fin de définition de ta fonction, ce qui compte c'est qu'il soit exécuté. Il est à l'intérieur de la définition de la fonction reader.onload : il sera exécuté et retournera une valeur quand reader.onload sera appelé. Et cette valeur sera appelée à celui qui appellera reader.onload . Mais aucun 'return' n'est exécuté quand tu appelles f.
Je viens de me renseigner sur le FileReader (que je ne connaissais pas). Il est appelé à la fin de la lecture. Donc onload ne sera appelé de manière synchrone pendnat l'exécution de f. Et la valeur sera retournée au système car c'est lui qui appelle la fonction événementielle, pas toi. Je ne vois pas comment utiliser une valeur retournée par le return d'une fonction événementielle.
Le seul moment où le résultat est disponible, c'est à la fin de la lecture, donc dans l'événement onload. Je réfléchis au moyen de récupérer cette valeur et je reviens, mais tu peux déjà être sûr que ce ne sera pas dans l'appel à f.
0
Utilisateur anonyme
5 sept. 2014 à 09:15
Remarque complémentaire : ce ne sera pas non plus lors du drop, pour la même raison.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Je ne vais pas me lancer dans la simulation, je n'ai jamais pratiqué le drag and drop et je ne connais pas les Blobs, il me faudrait trop de temps.
Une chose me semble sûre : tu ne peux pas retourner une valeur de ton onload.
Que veux-tu vraiment faire des données lues ? Si c'est les enregistrer, dans quelle variable ?
0
lamouchetsetse Messages postés 112 Date d'inscription samedi 2 août 2014 Statut Membre Dernière intervention 21 septembre 2021 2
5 sept. 2014 à 20:34
Bonjour le père et merci pour tes réponses. En fait je souhaite enregistrer les données dropper dans un objet et envoyer ensuite cette objet au serveur via JSON.
FileReader me permet de générer une url afin de pouvoir afficher mon fichier par exemple.
Mais pour pouvoir enregistrer les fichiers sur le serveur, dans la mesure je ne passe pas par input type="file" je n'aurais pas de $_FILES[tmp_name]. Je souhaite donc utiliser l'url créé par FileReader a la place du tmp_name.
Je ne sais pas si cela est possible, mais comme j'ai pu lire à plusieurs reprise que l'upload de fichier via le drag&drop était tout à fait réalisable depuis html5, j'ai pensé que la solution était peu etre de faire comme ça.
0
Utilisateur anonyme
6 sept. 2014 à 00:17
Alors, à ta place de ton
return read;
, affecte les données reçues à l'objet en question et envoie-les.
0
lamouchetsetse Messages postés 112 Date d'inscription samedi 2 août 2014 Statut Membre Dernière intervention 21 septembre 2021 2
Modifié par lamouchetsetse le 6/09/2014 à 11:00
oui, c'est ce que j'ai fini par faire. ça fonctionne maintenant.
du moins le transfert de données vers le serveur fonctionne, je n'ai pas encore tester l'affichage des données.
Je ferai un dernier post pour dire si tout fonctionne bien des que j'aurais fini de tout codé
Merci pour le coup de main.
0
baladur13 Messages postés 46396 Date d'inscription mercredi 11 avril 2007 Statut Modérateur Dernière intervention 25 avril 2024 13 222
6 sept. 2014 à 11:28
0