J'essaie de créer une promesse avec une demande d'API en boucle à Spotify. Spotify fonctionne de sorte que je ne puisse obtenir que 100 pistes à la fois, je vérifie donc s'il y en a plus et répercuter la fonction jusqu'à ce que toutes les pistes soient ajoutées à la liste "Articles". À l'heure actuelle, la promesse se résout après 1 demande, mais je dois résoudre après toutes les demandes. Mon code:
function getItems(myUrl) { return new Promise((resolve, reject) => { let items = [] request.post(authOptions, function(error, response, body) { if (!error && response.statusCode === 200) { // use the access token to access the Spotify Web API var token = body.access_token; var options = { url: myUrl, headers: { 'Authorization': 'Bearer ' + token }, json: true }; request.get(options, function(error, response, body) { if (error) return reject(error); for (var item of body['items']) { items.push(item) } if (response.body.next != null) { getItems(response.body.next) } resolve(items) }) } else { reject(error) } }) return items }) } getItems('https://api.spotify.com/v1/playlists/1vZFw9hhUFzRugOqYQh7KK/tracks?offset=0') .then(res => console.log(res))
3 Réponses :
faire quelque chose comme
p>
function getItems(myUrl, offset=0, items=[]) { return new Promise((resolve, reject) => { request.post(authOptions, function(error, response, body) { if (!error && response.statusCode === 200) { // use the access token to access the Spotify Web API var token = body.access_token; var options = { url: myUrl, headers: { 'Authorization': 'Bearer ' + token }, json: true }; request.get(options, function(error, response, body) { if (error) return reject(error); items = items.concat(body.item); offset++; if (response.body.next != null) { return resolve(getItems(response.body.next), offset, items) } else { return resolve(items) } }) } else { reject(error) } }) }) } getItems('https://api.spotify.com/v1/playlists/1vZFw9hhUFzRugOqYQh7KK/tracks?offset=0') .then(console.log(items))
Renvoyer la résolution (éléments) code> n'a pas de sens. Vous avez commodément laissé tomber le code asynchrone - qu'est-ce que cela ressemble vraiment?
Je suis évidemment yada, yada -ing -ing une partie du code. Ma compréhension est la question de savoir comment gérer la récursion plutôt que l'appel actuel à Spotify. La déclaration de résolution présume que le code ASYNC utilise une promesse
Oui, mais la partie importante - que l'OP n'a pas compris - il manque: comment le code après le code ASYNC a-t-il concerné cette promesse?
essayé, cela. Sonne toujours à la .Chen instantanément, avant de résoudre la promesse
J'ai un peu changé pour pouvoir résoudre la promesse après la fin des demandes; Cependant, quand je console.log les articles, rien n'est retourné.
Il le rend à la déclaration d'autre pour résoudre les articles après environ 3 secondes, mais elle passe à la console.Logging les articles instantanément
Chaque (récursif) getItems code> appelle crée et renvoie sa propre promesse. Vous ne résolvez que le plus secret.
essayer d'utiliser async / attendre. Je ne pouvais pas déboguer mon code, car je n'ai pas accès à Spotify. Mais j'espère que cela vous aide à comprendre l'idée.
p>
async function getItems(url) { var items = []; async function getData(url, items) { return new Promise((resolve, reject) => { request.post(authOptions, function(error, response, body) { if (error || response.statusCode !== 200) reject(error); var token = body.access_token; var options = { url: url, headers: { 'Authorization': 'Bearer ' + token }, json: true }; request.get(options, function(error, response, body) { if (error) return reject(error); for (var item of body['items']) { items.push(item) } if (response.body.next == null) { resolve([items, null]) } else { resolve([items, response.body.next]) } }) }) }) } while (url) { var response = await getData(url, items); items = response[0]; url = response[1]; } return items; } const myUrl = 'https://api.spotify.com/v1/playlists/1vZFw9hhUFzRugOqYQh7KK/tracks?offset=0'; async function main() { const items = await getItems(myUrl); console.log('Result: ' + items) } main();
Je veux dire un jeton d'accès
Yoooo, tu es la chèvre, ça a fonctionné. JE VOUS REMERCIE BEAUCOUP
Ce serait beaucoup, beaucoup plus facile (en particulier la mise en œuvre de bonne gestion des erreurs) si vous passez à l'aide d'une bibliothèque comme < CODE> GOT () CODE> supporte de manière native les promesses afin que vous n'essayez pas de corriger des rappels simples et de les envelopper en quelque sorte dans une promesse. En outre, la bibliothèque
requête () code> a été obsolète et ne devrait probablement pas être utilisée pour le nouveau code.
FYI, votre appel récursif vers
getItems () code> retourne une promesse. Vous devez utiliser cette promesse.
"Comment résolvez-vous une promesse après plusieurs demandes d'API? i>" - vous ne le faites pas. Vous résolvez une promesse immédiatement après chaque demande. Ensuite, vous utilisez une promesse en chaussette pour implémenter votre méthode reconsive
getItems code>.
Regardez Stackoverflow.com/a/54219609/1048572 ou Stackoverflow.com/a/28550024/1048572