-1
votes

En utilisant des promesses dans une boucle. Comment dites-vous quand c'est fini?

voici le jsfiddle: https://jsfiddle.net/8ocdupar/

P>

(index):39 Response {type: "cors", url: "https://jsonplaceholder.typicode.com/todos/1", redirected: false, 
status: 200, ok: true, …}
(index):39 Response {type: "cors", url: "https://jsonplaceholder.typicode.com/todos/1", redirected: false, 
status: 200, ok: true, …}
(index):39 Response {type: "cors", url: "https://jsonplaceholder.typicode.com/todos/1", redirected: false, 
status: 200, ok: true, …}
(index):39 Response {type: "cors", url: "https://jsonplaceholder.typicode.com/todos/1", redirected: false, 
status: 200, ok: true, …}
(index):39 Response {type: "cors", url: "https://jsonplaceholder.typicode.com/todos/1", redirected: false, 
status: 200, ok: true, …}
(index):39 Response {type: "cors", url: "https://jsonplaceholder.typicode.com/todos/1", redirected: false, 
status: 200, ok: true, …}
DONE!!!


1 commentaires

Vous voulez dire quelque chose comme promess.all (arr.map (nr => fetch ("https://jsonplaceholder.typicode.com/todos/" + nr))). alors (Console.log); ?


3 Réponses :


3
votes

Utilisez async code> et attendre code>:

p>

(async function () {
  var arr = [0,1,2,3,4,5];
  for (var i = 0; i < arr.length; i++) {
    let response = await fetch("https://jsonplaceholder.typicode.com/todos/1")
    let o = await response.json(); // <-- you'll want this too...
    console.log(o);
  }
  console.log("DONE!!!")
})(); // <-- execute it


1 commentaires

Cela a l'effet secondaire des demandes exécutant séquentiellement plutôt que parallèlement.



2
votes

Utilisez promess.All code> pour créer une nouvelle promesse qui résout une fois que toutes les promesses fournies ont été résolues.

p>

let arr = [0, 1, 2, 3, 4, 5]
let promises = []

for (let i = 0; i < arr.length; i++) {
  promises.push(
    window
      .fetch("https://jsonplaceholder.typicode.com/todos/1")
      .then(response => {
        console.log(response)
      })
  )
}

Promise.all(promises).then(() => {
  console.log("DONE!!!")
})


1 commentaires

C'est le moyen de le faire en général, à moins qu'une demande dépend d'un résultat d'un précédent. Ensuite, le plus tard aura besoin d'attendre que le premier se termine. +1



0
votes

Lorsque vous appelez Fetch , il retournera un objet de promesse qui résoudra lorsqu'une réponse est disponible. JavaScript ne pas automatiquement fait quelque chose avec cet objet de promesse, cependant; Vous devez être explicite sur ce que vous voulez faire avec cela.

L'utilisation de base pour une promesse est généralement "faire quelque chose lorsque cette promesse est résolue", qui fonctionne en appelant le .Chen () méthode sur l'objet de promesse avec une fonction de rappel passée; Vous montrez déjà que dans votre code en faisant .then (réponse => {console.log (réponse)}) .

Pour savoir quand multiple Les promesses ont fini, utilisez la fonction statique promess.all . Vous devrez garder une trace de tous les objets de promesse que vous créez en les stockant dans une matrice ... xxx

puis passez ce tableau à promess.all < / code>. Cela rendra réellement un nouvel objet de promesse - celui-ci va résoudre quand tous les les promesses passées sont effectuées: xxx

Qu'est-ce que variable? Ce sera une matrimonie de toutes les valeurs résolues par chaque promesse dans le tableau . Donc, dans cet exemple, ce sera chaque objet de réponse.

(un PS important: lorsque vous faites promess.then (cb) , il retournera une nouvelle promesse; ceci La nouvelle promesse va résoudre lorsque la fonction cb résout et sa valeur résolue sera tout ce que cb est retourné. Ceci est très utile pour savoir quand vous utilisez prometteur. Tout , dans le cas par exemple, vous voulez obtenir le corps de la réponse; vous feriez promettes.push (extraire (...). ensuite (res => res.body ())); .)


0 commentaires