为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

SMILET 2022-10-08 10:38:11
我正在尝试通过对 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))
查看完整描述

2 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

在所有请求完成后,我对其进行了一些更改,以便能够解决承诺;但是,当我 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))


查看完整回答
反对 回复 2022-10-08
?
POPMUISE

TA贡献1765条经验 获得超5个赞

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


查看完整回答
反对 回复 2022-10-08
  • 2 回答
  • 0 关注
  • 118 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号