繁体   English   中英

带有jQuery Promise的链式ajax请求

[英]Chained ajax request with jquery promise

我有以下代码。 我正在做的是,首先我向第一个URL发出ajax请求。 我得到一个响应,我需要该响应中的一些数据。 因此,我将数据放入user对象。 该响应还包括另一个URL。 然后,我向该新URL发出另一个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;
        });
    },

您可以将$.ajax()调用的context选项设置为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;
    });
}

在此功能

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

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

您正在函数的本地范围内创建user变量。 所以当你做user['name'] = user.name; ,在分配的左侧,您不是在外部定义最高范围时引用的var user = {} ,而是本地user

尝试将获取的user数据命名为其他名称,例如userData

像这样将第二个.then放在第一个.then内(链接到$ .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
            };
        });
    });
},

完全不需要任何其他变量

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM