Javascript 将变量设置为ajax输出,该变量仅在调用时更改

Javascript 将变量设置为ajax输出,该变量仅在调用时更改,javascript,ajax,variables,Javascript,Ajax,Variables,我有一台收音机,正在制作剧本的最后一首歌。我想做的是: 从我的外部php脚本中获取url,播放歌曲,在歌曲末尾通过调用函数设置一个全局变量=当前url,当url更改时,全局变量保持不变,直到再次调用该函数并使用当前歌曲进行更新 目前,我所有的尝试都返回一个未定义或未捕获的TypeError:在下面的示例中,无法将属性“innerHTML”设置为null var data = $.ajax({ url: '../scripts/radio.php', data: { attr1: 'value1'

我有一台收音机,正在制作剧本的最后一首歌。我想做的是: 从我的外部php脚本中获取url,播放歌曲,在歌曲末尾通过调用函数设置一个全局变量=当前url,当url更改时,全局变量保持不变,直到再次调用该函数并使用当前歌曲进行更新

目前,我所有的尝试都返回一个未定义或未捕获的TypeError:在下面的示例中,无法将属性“innerHTML”设置为null

var data = $.ajax({
url: '../scripts/radio.php',
data: {
attr1: 'value1'
},
success: function(data) {
console.log(data);
}
});

function playFirst(){

var lastSong = data;
document.getElementById("songName").innerHTML = data;
fileChosen = true;
setupAudioNodes();

var request = new XMLHttpRequest();

request.addEventListener("progress", updateProgress);
request.addEventListener("load", transferComplete);
request.addEventListener("error", transferFailed);
request.addEventListener("abort", transferCanceled);

request.open('GET', data, true);
request.responseType = 'arraybuffer';

// When loaded decode the data
request.onload = function() {

$("#title").html("Infinite");
$("#album").html("Infinite");
$("#artist").html("");
onWindowResize();
$("#title, #artist, #album").css("visibility", "visible");

// decode the data
context.decodeAudioData(request.response, function(buffer) {
// when the audio is decoded play the sound
sourceNode.buffer = buffer;
sourceNode.start(0);
$("#freq, body").addClass("animateHue");
//on error
}, function(e) {
console.log(e);
});
};
request.send();
};

在成功回调中返回数据。由于尚未存储返回的数据,因此在调用playFirst时,返回的数据仍未定义

您可以将返回的数据存储在全局变量中,如下所示:

let data;
$.ajax({
    url: '../scripts/radio.php',
    data: {
        attr1: 'value1'
    },
    success: function(returnData) {
        data = returnData;
        console.log(data);
    }
});
或者在成功回调中调用playFirst:

$.ajax({
    url: '../scripts/radio.php',
    data: {
        attr1: 'value1'
    },
    success: function(data) {
        playFirst(data);
    }
});