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 p> Il renvoie un tableau vide. P> p>
4 Réponses :
Votre boucle est synchrone, il initie les appels ASYNC mais ne les attend jamais.
Soit vous pouvez utiliser J'ai fait un message moyen pour le même problème: promess.all code> pour obtenir tout le résultat parallèle. Ou peut utiliser
async-attendre code> en parallèle ou en série.
Super post et une excellente solution.
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); } }); });
Veuillez accepter la réponse si cela aidait à résoudre votre problème afin que nous puissions fermer ce fil sur Stackoverflow
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); }
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); });
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 :)