Javascript 在另一个ajax请求中使用来自一个ajax请求的数据

Javascript 在另一个ajax请求中使用来自一个ajax请求的数据,javascript,jquery,ajax,json,Javascript,Jquery,Ajax,Json,我正在学习ruby,但是我需要一些JS/Jquery来完成一个小项目,我正在和一个朋友一起工作。我们正在使用Last.fm api并尝试构建一个页面,在该页面中,我们将从两个不同的URL调用Json数据 在那里我们可以提取朋友的用户名和一些关于他们的信息 我们可以从中获得每个用户的最佳曲目 我遇到的主要问题是,一旦我取出用户名,我需要将其存储为一个变量,然后将其插入get TopTracks上的“&user=rj&”中,以便能够将每个用户都提取到TopTracks中 $.ajax({ t

我正在学习ruby,但是我需要一些JS/Jquery来完成一个小项目,我正在和一个朋友一起工作。我们正在使用Last.fm api并尝试构建一个页面,在该页面中,我们将从两个不同的URL调用Json数据

在那里我们可以提取朋友的用户名和一些关于他们的信息

我们可以从中获得每个用户的最佳曲目

我遇到的主要问题是,一旦我取出用户名,我需要将其存储为一个变量,然后将其插入get TopTracks上的“&user=rj&”中,以便能够将每个用户都提取到TopTracks中

$.ajax({
    type : 'POST',
    url : 'http://ws.audioscrobbler.com/2.0/?method=user.getfriends&user=rj&api_key=3d7e6bb560deeb5d15af8176abf5c928&format=json',
    dataType : 'json',
    success : function(data) {
        $('#success #f1').html(data.friends.user[0].name);
        $('#success #f2').html(data.friends.user[1].name);
        $('#success #f3').html(data.friends.user[2].name);
    },
    error : function(code, message){
        $('#error').html('Error Code: ' + code + ', Error Message: ' + message);            
    }
});

到目前为止,我所拥有的也是toptracks的一个,现在正在阅读嵌套它们的内容,但我不确定如何获取它们的用户名并将其存储为变量以在top tracks中使用。每个都适用于JS?

如果我正确理解问题,类似的内容可能会帮助您开始:

// at the top of your script create empty users var
var users = [];

// create a function that generates your endpoint url

var urlWithUser = function(user){
  return 'http://ws.audioscrobbler.com/2.0/?method=user.getfriends&user=' + user + '&api_key=3d7e6bb560deeb5d15af8176abf5c928&format=json'
};

// assign value to users
var getInitialData = function(){
    $.ajax({
        type : 'POST',
        url : 'http://ws.audioscrobbler.com/2.0/?method=user.getfriends&user=rj&api_key=3d7e6bb560deeb5d15af8176abf5c928&format=json',
        dataType : 'json',
        success : function(data) {
            users = data.friends.user;
            $.each(users, function(index, value){
                getUserData(this.name);
            };
        },
        error : function(code, message){
            $('#error').html('Error Code: ' + code + ', Error Message: ' + message);            
        }
    });
};

// create a function with your ajax call, which can be used to obtain specific user data
var getUserData  = function(user){
    $.ajax({
        type : 'POST',
        url : urlWithUser(user);
        dataType : 'json',
        success : function(data) {
            // do whatever you want
        },
        error : function(code, message){
            $('#error').html('Error Code: ' + code + ', Error Message: ' + message);            
        }
    });
};

// get first set of users
getInitialData();

请注意urlWithUser,它接受用户参数并用于为您生成特定端点。

Javascript不能像java等其他语言那样执行线程。为了解决这个问题,它设置了处理程序,即稍后由某个事件触发时将运行的函数。调用$.ajax{…};,javascript设置处理程序,但立即继续运行。成功处理程序直到收到ajax响应后才会运行。因此,任何放在$.ajax{…}之后的代码;将立即运行。如果您希望在收到响应后运行某些内容,则必须将其放入成功处理程序中。像这样:

success: function(data) {
    var users = data.friends.user;
    $.each(users, function(i, user) {
        $.ajax({
            url: 'http://ws.audioscrobbler.com/2.0/?method=user.gettoptracks&user=' + user + '&period=7day&api_key=3d7e6bb560deeb5d15af8176abf5c928&format=json',
            ...
            success: function(data) { ... },
            ...
        });
    });
},
注意:我生成URL的方式不好。包含&的用户名会混淆服务器,可能会让恶意用户对发送的命令控制过多。您应该转义用户


如果每个用户只有一个处理程序,那么这是可行的。例如,如果每个朋友都有页面的一部分,则可以在收到结果时更新每个部分。但是,如果您有一个函数希望在接收到所有数据后运行,那么它会变得有点棘手。在这种情况下,您可能应该学习使用async或Q之类的库。尽管我不确定async是否适用于客户端javascript。

这不起作用。结尾处的$.each循环将在getInitialData中的成功处理程序之前运行,而用户为空;getUserData永远不会运行。你需要将循环放入成功处理程序中。很好,我已经更新了我的响应,将其包含在成功处理程序中。我能够处理这个问题并让它工作,谢谢!