Faire plusieurs .fetch() de promesses
Je veux extraire plusieurs images et de les transformer en goutte. Je suis un newbie sur des promesses, j'ai essayé mais je ne peux pas passer à travers.
Ici ci-dessous, une seule .fetch()
promesse
fetch('http://cors.io/?u=http://alistapart.com/d/_made/d/ALA350_appcache_300_960_472_81.jpg')
.then(function(response) {
return response.blob();
})
.then(function(myBlob) {
var objectURL = URL.createObjectURL(myBlob);
document.getElementById('myImage').src = objectURL;
});
Maintenant plusieurs .fetch()
promesse (ne fonctionne pas)
var promises = [];
for (var i = values.length - 1; i >= 0; i--) {
promises.push(fetch(values[i]));
}
Promise
.all(promises)
.then(function(response) {
for (var i = response.length - 1; i >= 0; i--) {
return response[i].blob();
}
})
.then(function(blob) {
console.log(blob.length); //undefined !!!
for (var i = blob.length - 1; i >= 0; i--) {
console.log(blob[i]);
lcl_images[i].value = URL.createObjectURL(blob[i]);
document.getElementById(lcl_images[i].id).src = objectURL;
}
})
.catch(function(error) {
console.log(error);
});
Donc, quelle est la
.blob() renvoie un blob(), mais si vous êtes en train de faire de multiples promesses, vous avez à
OK, donc si
si vous essayez vous-même, cela ne fonctionne pas, je suis un newbie sur promesse. J'ai essayé plusieurs fois de faire ce que vous avez dit, mais vous devez retourner la promesse
Je vais écrire une réponse pour vous.
.blob()
de retour de méthode, un blob
ou un promise
?.blob() renvoie un blob(), mais si vous êtes en train de faire de multiples promesses, vous avez à
return Promise.all(blobs)
dans .then(response)
. Après cela, dans .then(blob)
-> blob est tableau d'objets blobOK, donc si
.blob()
est synchrone, alors vous n'avez pas besoin de deux .arrêtera. Promise.all(promises).then(function(responses) {...}).catch(...);
va faire le travail sans jamais avoir besoin de créer un tableau d'objets blob.si vous essayez vous-même, cela ne fonctionne pas, je suis un newbie sur promesse. J'ai essayé plusieurs fois de faire ce que vous avez dit, mais vous devez retourner la promesse
response[i].blob()
et dans la prochaine .then
vous aurez l'objet blob.Je vais écrire une réponse pour vous.
OriginalL'auteur FrancescoN | 2016-06-24
Vous devez vous connecter pour publier un commentaire.
Vous êtes de retour dans le gestionnaire d'après la première réponse, au lieu de ce que vous devez faire est de retourner la liste des blobs:
TypeError: Failed to execute 'createObjectURL' on 'URL': No function was found that matched the signature provided.(…)
Lorsque vous
return blobs
, vous vous retrouvez avecblobs
dans la fonction suivante, pasblob
.blob.length
est undefined, car c'est un tableau d'objets blob, pas une seule goutte.Dans ce cas également, votre
blobs
sont en fait un tableau de des promesses pour les gouttes, ce qui signifie que vous devezreturn Promise.all(blobs)
. Vraiment, vous devriez renommer queblobs
àblobPromises
ou quelque chose.OriginalL'auteur Łukasz
C'est une règle générale qu'une filiale en synchrone étape intermédiaire dans la voie du succès d'une promesse de la chaîne peut être fusionnée avec la prochaine étape, permettant ainsi une
then()
être omise de la chaîne.Il est en fait une réserve sur cette déclaration, impliquant des intermédiaires de captures, mais il suffira pour cette réponse.
Donc, si l'
.blob()
méthode est geuinely synchrone (elle renvoie une valeur), un seul.then()
est nécessaire, non pas de deux.Voici deux approches, à la fois d'exploiter les Tableau.le prototype.map(), et les deux doivent travailler (mais ils seront différents selon les conditions d'erreur):
1. Simple
.map()
avec des détails enPromise.all()
Si vous préférez, vous pouvez écrire :
2. Détail dans
.map()
suivi une simplePromise.all()
Notes:
fetch()
échoue.imageObj.value ...
etelement.src = ...
trucs pour tous les succès récupère même si un ou plusieursfetch()...
échoue. Une seule panne dePromise.all(promises)
pour retourner le refus de la promesse..blob()
méthode renvoie une promesse, pas une valeur.Si c'est l'API qui est appelée, alors c'est cool. Tout objet autre qu'une promesse est OK ici.
OriginalL'auteur Roamer-1888