Javascript 如何编写回调函数来更改AJAX for jquery中的全局变量?

Javascript 如何编写回调函数来更改AJAX for jquery中的全局变量?,javascript,jquery,ajax,Javascript,Jquery,Ajax,好吧,我看了很多答案,但没有一个对我想要实现的目标有帮助。假设我有以下代码: var n = 0; $.ajax({ ... success: function(data){ n = Math.floor((Math.random()*10) + 1); somefunction(n); } }); console.log(n) // n would obviously be 0 again 我是通过使用async:false使其同步来

好吧,我看了很多答案,但没有一个对我想要实现的目标有帮助。假设我有以下代码:

var n = 0;
$.ajax({
    ...
    success: function(data){
        n = Math.floor((Math.random()*10) + 1);
        somefunction(n);
    }
});

console.log(n) // n would obviously be 0 again

我是通过使用
async:false
使其同步来实现的,但从我所读到的内容来看,这对用户体验不利,因为它会在等待结果时冻结浏览器。在上述情况下,如何实现回调函数,以允许在ajax调用后修改全局变量
n

您可以使用JavaScript本地存储:

 $.ajax({
    ...
    success: function(data){
        n = Math.floor((Math.random()*10) + 1);
        somefunction(n);
localStorage.setItem("n", 100)
    }
});

var n;
if(typeof(Storage) !== "undefined") {
    // Code for localStorage.
    n = localStorage.getItem("lastname");
} else {
    // Sorry! No Web Storage support..
}

异步函数在不同的线程中执行(非阻塞),因此回调将在下一条指令之后调用:

console.log(n);
n
是在调用回调(成功函数)之后设置的,但日志是在异步函数完成之前设置的。一个简单的解决方案是将代码封装在函数中,并在jQuery调用success函数后调用它。请注意,您不需要引用全局变量,因为它将被设置在jQuery范围之外,并且可以被
operation\u x
函数范围访问

var n = 0;
function operation_x(){
    console.log(n); // n is set to random value
}
$.ajax({
    ...
    success: function(data){
        n = Math.floor((Math.random()*10) + 1);
        somefunction(n);
        operation_x();
    }
});
console.log(n); // n is 0

这取决于更新全局变量n时希望如何使用它。你能描述一下你使用n的目的和最终如何向用户显示它吗?长话短说,我正在制作一个音乐问答web应用程序,我有一个很长的歌曲对象数组和它们的URL列表。Ajax调用只是从歌曲的url检索内容。因为我想随机化
n
以获得一首随机歌曲,然后在ajax调用完成后,我可以检查我选择的歌曲是否与随机歌曲匹配。这就是问题所在,我不能修改
n
,因为它在一开始就不会被修改,因为ajax的性质。这会有什么帮助?
在上述情况下,我如何实现回调函数以允许在ajax调用后修改全局变量n?
。在你的例子中,
n
在调用后被修改,但在修改之前输出:)真的,我搞错了。我想问的是,在调用后如何使用回调函数输出它,这与
localStorage
有什么关系?他没有要求坚持。