Javascript Promesses avec FileReader()
J'ai le Code HTML suivant:
<input type='file' multiple>
Et Voici mon Code JS:
var inputFiles = document.getElementsByTagName("input")[0];
inputFiles.onchange = function(){
var fr = new FileReader();
for(var i = 0; i < inputFiles.files.length; i++){
fr.onload = function(){
console.log(i) //Prints "0, 3, 2, 1" in case of 4 chosen files
}
}
fr.readAsDataURL(inputFiles.files[i]);
}
Donc ma question est, comment puis-je faire cette boucle synchrone ? C'est d'abord attendre que le fichier à la fin du chargement, puis passer au fichier suivant. Quelqu'un m'a dit d'utiliser JS Promises
. Mais je ne peux pas me rendre au travail. Voici ce que j'essaie:
var inputFiles = document.getElementsByTagName("input")[0];
inputFiles.onchange = function(){
for(var i = 0; i < inputFiles.files.length; i++){
var fr = new FileReader();
var test = new Promise(function(resolve, reject){
console.log(i) //Prints 0, 1, 2, 3 just as expected
resolve(fr.readAsDataURL(inputFiles.files[i]));
});
test.then(function(){
fr.onload = function(){
console.log(i); //Prints only 3
}
});
};
}
Merci d'avance...
Les promesses sont utilisés pour les opérations asynchrones.
Comment puis-je faire synchrone alors ? J'ai étudié sur internet, ils disent tous qu'elle rend le code synchrone
Non, promet de ne pas faire de code synchrone. Pouvez-vous point à un de ces endroits que "tous", disent-ils faire?
MDN a Dit: "Une Promesse représente un proxy pour une valeur pas nécessairement connues lorsque la promesse est créé. Il vous permet d'associer les gestionnaires à une action asynchrone de l'éventuelle valeur de succès ou de l'échec de la raison. Cela vous permet de méthodes asynchrones valeurs de retour comme les MÉTHODES SYNCHRONES":
Oui. Vous pouvez la faire se comporter de manière quasi-synchrone si par synchrones vous dire que vous pouvez contrôler l'ordre dans lequel les différentes parties de votre fichier de lecture de code sont exécutées. Mais il continue à fonctionner de manière asynchrone dans le respect de la souris, par exemple les gestionnaires ou le moteur JavaScript lui-même. "comme une méthode synchrone" n'est pas la même chose que "est une méthode synchrone".
Comment puis-je faire synchrone alors ? J'ai étudié sur internet, ils disent tous qu'elle rend le code synchrone
Non, promet de ne pas faire de code synchrone. Pouvez-vous point à un de ces endroits que "tous", disent-ils faire?
MDN a Dit: "Une Promesse représente un proxy pour une valeur pas nécessairement connues lorsque la promesse est créé. Il vous permet d'associer les gestionnaires à une action asynchrone de l'éventuelle valeur de succès ou de l'échec de la raison. Cela vous permet de méthodes asynchrones valeurs de retour comme les MÉTHODES SYNCHRONES":
Oui. Vous pouvez la faire se comporter de manière quasi-synchrone si par synchrones vous dire que vous pouvez contrôler l'ordre dans lequel les différentes parties de votre fichier de lecture de code sont exécutées. Mais il continue à fonctionner de manière asynchrone dans le respect de la souris, par exemple les gestionnaires ou le moteur JavaScript lui-même. "comme une méthode synchrone" n'est pas la même chose que "est une méthode synchrone".
OriginalL'auteur Zahid Saeed | 2015-12-28
Vous devez vous connecter pour publier un commentaire.
Si vous voulez le faire de façon séquentielle( pas simultanément) à l'aide de Promesses, vous pourriez faire quelque chose comme:
J'ai eu à faire
new Promise<Event>((resolve, reject) => {
pour obtenir que cela fonctionne... (Besoin de l'<Event>
générique.)OriginalL'auteur mido
Nous avons modifié midos réponse à faire fonctionner le suivant:
OriginalL'auteur Jens Lincke
La nature de
FileReader
est que vous ne pouvez pas faire son fonctionnement synchrone.Je soupçonne que vous n'avez pas vraiment besoin ou voulez qu'il soit synchrone, c'est juste que vous voulez obtenir de l'résultant Url correctement. Si oui, je ne pense pas que les promesses qui serait vraiment utile. Au lieu de cela, il suffit de garder la trace du nombre d'opérations en cours, vous devez donc vous savez quand vous avez terminé:
Ou si vous souhaitez pour une raison de lire les fichiers séquentiellement (mais toujours de façon asynchrone), vous pouvez le faire en programmant le prochain appel que lorsque la précédente est terminée:
OriginalL'auteur T.J. Crowder
Voici une autre modification de Jens' réponse (ferroutage hors Mido réponse) afin de vérifier la taille du fichier:
OriginalL'auteur JasonZiolo