Jquery 如何使用延迟对象从一个api调用到另一个api调用获取数据?

Jquery 如何使用延迟对象从一个api调用到另一个api调用获取数据?,jquery,ajax,kendo-grid,jquery-deferred,Jquery,Ajax,Kendo Grid,Jquery Deferred,我必须进行两个api调用-租户和用户。租户api返回所有现有租户的详细信息,用户api将返回特定租户中的所有用户。我需要在第一次函数调用后将租户ID与其详细信息进行映射。我必须使用这些键值作为第二个api调用的参数(它接受租户ID(整数))。在第二个api调用完成后,我必须为用户创建另一个映射,租户ID作为键,用户详细信息作为值 var tenants = {}; var users = {}; function func1() {

我必须进行两个api调用-租户和用户。租户api返回所有现有租户的详细信息,用户api将返回特定租户中的所有用户。我需要在第一次函数调用后将租户ID与其详细信息进行映射。我必须使用这些键值作为第二个api调用的参数(它接受租户ID(整数))。在第二个api调用完成后,我必须为用户创建另一个映射,租户ID作为键,用户详细信息作为值


    var tenants = {};
    var users = {};
    function func1() {
                    $.ajax({
                        dataType: 'json',
                        url: crudUrl("tenants"),
                        success: function (response) {
                            response.forEach(function (item) {
                                var TTId = item.Id.toString();
                                if (!("key" in tenants)) {
                                    tenants[TTId] = item;
                                }
                            })
                        }
                    });
                }

    function func2(key) {
                    return $.ajax({
                        dataType: 'json',
                        url: crudUrl("tenants/{tenantId}/users"),
                        data: {
                            tenantId: key
                        },
                        success: function (response) {
                            var detail = [];
                            var TTId = key;
                            response.forEach(function (item) {
                                var uid = {}
                                uid.Id = item.Id;
                                uid.Name = item.Name;
                                detail.push(uid);
                            })
                            users[TTId] = detail;
                        }
                    });
                }

       $.when(func1()).then(function () {
            for (var key of Object.keys(tenants)) {
                func2(parseInt(key));
            }
        });


上述方法可以工作,但网络负载过大,因为它必须在func2中对从func1获得的每个键进行多个ajax调用。我很确定这也可以使用延迟对象来完成,但我不知道如何使用它。我是新手,希望您能提供帮助。

您能更改API吗?这似乎是一种加载所有数据的特别低效的方法。您甚至需要一次加载所有数据吗?通常是这样做的,所以你加载租户列表,当用户选择一个租户时,你只加载该租户的用户列表,而不是预先加载所有内容。实际上我必须使用这两个映射,这样我就可以更改剑道网格的行模板数据了。这是否会阻止您添加另一个API调用,一次加载所有数据?您没有提到服务器端技术,因此您可能还可以在初始渲染中预先加载所有技术。我从来没有提到过改变地图,只是改变了地图的填充方式。你好像有点问题。