用jquery承诺链接ajax请求

时间:2016-10-22 00:58:55

标签: javascript jquery ajax

我有以下代码。我正在做的是首先我向第一个网址发出ajax请求。我得到了回复,我需要来自该回复的一些数据。因此,我将该数据放入user对象中。该回复还包括另一个网址。然后我再向该新网址发出ajax请求。我从URL获得响应,然后将该数据添加到user对象。在最后一个then()函数中,我返回user个对象。但是,当我拨打get().done(function(data) { console.log(data) })时,我只会获得user.data数组。它在第一个ajax请求中不包含用户的详细信息。 如何合并这两个请求中的数据并作为承诺返回(可能是延迟的)?

    var get = function() {
        var user = {};

        return $.ajax({
            url: 'URL',
            method: 'GET',
            type: 'JSON'
        }).then(function(user) {
            user['name'] = user.name;
            user['joined'] = user.create_at;

            return $.ajax({
                url: user.url,
                method: 'GET',
                type: 'JSON'
            });
        }).then(function(data) {
            user['data'] = data;
            return user;
        });
    },

3 个答案:

答案 0 :(得分:2)

您可以设置context$.ajax()对象的user次调用选项

var get = function() {
    var user = {};

    return $.ajax({
        url: 'URL',
        method: 'GET',
        type: 'JSON',
        context: user
    }).then(function(user) {
        this['name'] = user.name;
        this['joined'] = user.create_at;

        return $.ajax({
            url: user.url,
            method: 'GET',
            type: 'JSON',
            context: this
        });
    }).then(function(data) {
        this['data'] = data;
        return this;
    });
}

答案 1 :(得分:1)

在此功能中

function(user) {
    user['name'] = user.name;
    user['joined'] = user.create_at;

    return $.ajax({
        url: user.url,
        method: 'GET',
        type: 'JSON'
    });
}

您正在函数的本地scope中创建user变量。因此,当您执行user['name'] = user.name;时,在作业的左侧部分,您不是指在外部,最高范围内定义的var user = {},而是指本地user

尝试将提取的user数据命名为其他内容,例如userData

答案 2 :(得分:1)

把你的第二个。然后放在第一个。然后(链接到$ .ajax调用)就像这样

var get = function() {
    return $.ajax({
        url: 'URL',
        method: 'GET',
        type: 'JSON'
    }).then(function(user) {
        return $.ajax({
            url: user.url,
            method: 'GET',
            type: 'JSON'
        }).then(function(data) {
            return {
                name: user.name,
                joined: user.create_at,
                data: data
            };
        });
    });
},

根本不需要任何其他变量