首页 > 解决方案 > 在多个 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))

标签: javascriptasynchronouspromiserequest

解决方案


尝试使用异步/等待。我无法调试我的代码,因为我没有 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();


推荐阅读