猿问

在多个 API 请求后如何解决一个 Promise?

我正在尝试通过对 Spotify 的循环 API 请求来创建一个承诺。Spotify 的工作方式使我一次只能获得 100 首曲目,因此我检查是否还有更多曲目并重新运行该功能,直到所有曲目都附加到“项目”列表中。现在,承诺在 1 个请求后解决,但我需要在所有请求完成后解决。我的代码:


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


SMILET
浏览 119回答 2
2回答

郎朗坤

在所有请求完成后,我对其进行了一些更改,以便能够解决承诺;但是,当我 console.log 项目时,没有返回任何内容。let items = []function getItems(myUrl) {  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);          for (var item of body['items']) {            items.push(item)          }          if (response.body.next != null) {            getItems(response.body.next)          } else {            resolve(items)          }        })      } else {        reject(error)      }    })  })}getItems('https://api.spotify.com/v1/playlists/1vZFw9hhUFzRugOqYQh7KK/tracks?offset=0')  .then(console.log(items))

POPMUISE

尝试使用异步/等待。我无法调试我的代码,因为我没有 Spotify 访问权限。但我希望它可以帮助你理解想法。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();
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答