Spotify API,无法链接两个API调用(Authorization-GetSong)

问题描述 投票:0回答:1

简单地说,我正在尝试从API中获取令牌,之后获取带有令牌的歌曲。由于将令牌存储在全局变量中并且在异步执行getAuthorizationToken之后,会立即调用getSong函数。因此,对于获取歌曲并获取HTTP 401,将调用API,其值为undefined。

var XMLHttpRequest = require('xhr2');

function getAuthorizationToken() {
    let request = new XMLHttpRequest();
    request.open('POST', 'https://accounts.spotify.com/api/token/', true);
    request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    request.setRequestHeader('Authorization', "Basic " + Buffer.from(config.clientID + ":" + config.clientSecret).toString('base64'));
    request.onload = function () {
        let data = JSON.parse(this.response);
        if (request.status === 200) {
            console.log(data['access_token']);
            authorizationToken = data['access_token'];
        }
    };
    request.send("grant_type=client_credentials");
}

function getSong() {
    let request = new XMLHttpRequest();
    request.open('GET', 'https://api.spotify.com/v1/tracks/2TpxZ7JUBn3uw46aR7qd6V', true);
    request.setRequestHeader('Authorization', "Bearer " + authorizationToken);
    request.onload = function () {
        let data = JSON.parse(this.response);
        console.log(data)
    };
   request.send();
}
getAuthorizatonToken();
getSong(); //this is invoked before authorizatonToken's value assigned.

我试着用Promise这样链接;

function getAuthorizationToken() {

return new Promise(() => {
    let request = new XMLHttpRequest();
    request.open('POST', 'https://accounts.spotify.com/api/token/', true);
    request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    request.setRequestHeader('Authorization', "Basic " + Buffer.from(config.clientID + ":" + config.clientSecret).toString('base64'));
    request.onload = function () {
        let data = JSON.parse(this.response);
        if (request.status === 200) {
            console.log(data['access_token']);
            authorizationToken = data['access_token'];
        }
    };
    request.send("grant_type=client_credentials");
    });
}

function getSong() {
    // same method 
}

getAuthorizationToken().then(getSong);

但是,它没有为getSong函数返回任何内容。我不确定,但我相信诺言不等onload

另外,我试图同步发送第一个请求,它给出了一个错误;

错误:未实现同步XHR处理

我不熟悉JavaScript的编码,我的思维方式有什么问题?

javascript api xmlhttprequest spotify
1个回答
1
投票

您的承诺的问题是您需要解决或拒绝退出承诺并将令牌数据传递给下一个承诺或功能。

一个简单的promise函数如下所示:

var promise = new Promise(function(resolve, reject) {
  setTimeout(function() {
    resolve('foo');
  }, 300);
});

这是最终的代码:

var config = require('./config.json');
var XMLHttpRequest = require('xhr2');


function getAuthorizationToken() {
    return new Promise(function (resolve, reject) {
        let request = new XMLHttpRequest();
        request.open('POST', 'https://accounts.spotify.com/api/token/');
        request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        request.setRequestHeader('Authorization', "Basic " + Buffer.from(config.clientID + ":" + config.clientSecret).toString('base64'));

        request.onload = function () {
            if (request.status === 200) {   
                let responseBody = JSON.parse(this.response);                              
                resolve(responseBody["access_token"]);
            }else{
                reject(request.status);
            }
        };
        request.onerror = function () {
            reject(Error("Network Error"));
        };
        request.send("grant_type=client_credentials");
    });

}

function getSong(authorizationToken) {
    return new Promise(function(resolve,reject) {

        let request = new XMLHttpRequest();
        request.open('GET', 'https://api.spotify.com/v1/tracks/2TpxZ7JUBn3uw46aR7qd6V', true);
        request.setRequestHeader('Authorization', "Bearer " + authorizationToken);
        request.onload = function () {
            if (request.status === 200) {   
                let responseBody = JSON.parse(this.response);                              
                resolve(responseBody);
            }else{
                reject(request.status);
            }
        };
        request.onerror = function () {
            reject(Error("Network Error"));
        };
        request.send();
    });
}

getAuthorizationToken().then(function (authorizationToken) {
    getSong(authorizationToken).then(function (data) {
        console.log(data);        
    })
});
© www.soinside.com 2019 - 2024. All rights reserved.