0
votes

Attendez un résultat pour une API à l'intérieur d'une boucle

Je suis nouveau au nœud et j'ai essayé de comprendre des promesses, mais c'est un peu compliqué. J'essaie d'appeler une API plusieurs fois, puis de retourner mon résultat. Mais ma route envoie une réponse en premier.

Je veux retourner ma réponse seulement après avoir fini la boucle xxx

Il renvoie un tableau vide.


1 commentaires

Vous suggérerait de jeter un coup d'œil à la boucle d'événement de nœud pour mieux comprendre la nature asynchrone du nœud :)


4 Réponses :


2
votes

Votre boucle est synchrone, il initie les appels ASYNC mais ne les attend jamais. Soit vous pouvez utiliser promess.all pour obtenir tout le résultat parallèle. Ou peut utiliser async-attendre en parallèle ou en série. xxx

J'ai fait un message moyen pour le même problème: https://medium.com/trapspanda/loops-Asynchrone- Fonctions et retournements-Résultats collectifs-in-Node-JS-B7566285FB74


1 commentaires

Super post et une excellente solution.



0
votes

En savoir dès que les demandes sont asynchrones, vous avez besoin d'un travail autour afin de maintenir sur le résultat jusqu'à la fin de la fin des demandes, vous pouvez y parvenir par un comptoir comme:

data = {}
let count = 0;
req.body.words.forEach(function (word) {
    count++;
    return newsapi.v2.everything({
        q: word,
        domains: req.body.domains.join(', '),
        sort_by: 'relevancy'
        })
        .then(response => {
            data[word]=response;
            //return only if all the entries are processed
            if (count === req.body.words.length) {
                return res.json(data);
            }
        });
    });


1 commentaires

Veuillez accepter la réponse si cela aidait à résoudre votre problème afin que nous puissions fermer ce fil sur Stackoverflow



0
votes
let promisesToAwait = [];
let words = req.body.words;
for (let j = 0; j < words.length; j++) {
   promisesToAwait.push(await this.loopThruAllWords(words[j], req.body.domains.join(', ')));
}
let allResponses = await Promise.all(promisesToAwait1);

async loopThruAllWords(word, domains){
let response = await newsapi.v2.everything({
    q: word,
    domains: domains,
    sort_by: 'relevancy'
    });
return Promise.resolve(response);
}

0 commentaires

0
votes

Vous pouvez utiliser "FOR-ASYNC" NPM:

   var forAsync = require("for-async");

    data = {}
     forAsync(req.body.words, function (word, i) {
          return new Promise(function (next) {

            newsapi.v2.everything({
              q: word,
              domains: req.body.domains.join(', '),
              sort_by: 'relevancy'
              })
              .then(response => {
                data[word]=response;
                next(); //go to the next iteration
            });

          });
      }).then(() => {
         console.log("Loop finished");
         return res.json(data);
      });


0 commentaires