0
votes

Comment résolvez-vous une promesse après plusieurs demandes d'API?

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))


4 commentaires

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 () 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 () a été obsolète et ne devrait probablement pas être utilisée pour le nouveau code.


FYI, votre appel récursif vers getItems () retourne une promesse. Vous devez utiliser cette promesse.


"Comment résolvez-vous une promesse après plusieurs demandes d'API? " - 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 .


Regardez Stackoverflow.com/a/54219609/1048572 ou Stackoverflow.com/a/28550024/1048572


3 Réponses :


0
votes

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))


4 commentaires

Renvoyer la résolution (éléments) 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



0
votes

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é. xxx


2 commentaires

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 appelle crée et renvoie sa propre promesse. Vous ne résolvez que le plus secret.



0
votes

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();


2 commentaires

Je veux dire un jeton d'accès


Yoooo, tu es la chèvre, ça a fonctionné. JE VOUS REMERCIE BEAUCOUP