Javascript 如何缓存JQUERY获取响应(数据)并在另一个函数中使用它?

Javascript 如何缓存JQUERY获取响应(数据)并在另一个函数中使用它?,javascript,jquery,html,ajax,Javascript,Jquery,Html,Ajax,我的数据库中有下表: +-----------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+----------------+ | id | int(11) | NO |

我的数据库中有下表:

+-----------+-------------+------+-----+---------+----------------+
| Field     | Type        | Null | Key | Default | Extra          |
+-----------+-------------+------+-----+---------+----------------+
| id        | int(11)     | NO   | PRI | NULL    | auto_increment |
| fullname  | varchar(50) | YES  |     | NULL    |                |
| email     | varchar(50) | YES  |     | NULL    |                |
| password  | varchar(50) | YES  |     | NULL    |                |
| gender    | varchar(50) | YES  |     | NULL    |                |
| birthdate | varchar(50) | YES  |     | NULL    |                |
+-----------+-------------+------+-----+---------+----------------+
我通过以下ajax方法从同一个数据库查询数据:

function getUserDB(){
    return ($.ajax({
        url: 'services/users?',
        method: 'get',
        headers: { 'Accept': 'application/json' }, 
        success: function(data) {
                console.log ("getUserDB got the user data");
                UserDB = JSON.stringify(data);
                UserDBObj = JSON.parse(UserDB);
            }
    }));
}
我有一个HTML页面,根据
id
,它应该在不同的位置(div)显示
fullname
。 为了避免为每个
div
触发jQuery,我认为可以将响应存储在页面加载中,并使用另一种方法获取
全名。
以下是我写的:

function getUserName(ID){
    var username;
    console.log(" getUserName called");
    for(var index in UserDBObj){
        if (UserDBObj[index] == ID)
        {
            username = UserDBObj[index].fullname;
            console.log("Got username : "+ username);
        }
     }
    return username;
}
我调用
getUserName(id)
以获得必须显示名称的相应div。 但是,这不起作用,因为ajax调用是异步的,
getUserName(id)
甚至在获取数据之前就被调用了


如何实现这一目标,有什么建议吗?我见过类似的问题,但没有一个是决定性的。

一旦加载了数据处理例程,就执行它

类似这样的内容(必须替换“myDivSelector”):

您基本上可以做的(不改变应用程序的一般行为)是使getUserName函数也异步,因为它取决于异步事件

有一种可能是这样的:

(我只给出一个大纲,没有给出完整的代码)

此处仅列出成功处理程序的概要:

    success: function(data) {
        console.log ("getUserDB got the user data");
            UserDB = JSON.stringify(data);
            UserDBObj = JSON.parse(UserDB);
            UserDBObj_isLoaded = true;

            // process all the callback functions till now
            for (i=0; i<UserDBObj_cbs.length; i++) {
                UserDbObj_cbs[i]();
            }
        }
成功:函数(数据){
console.log(“getUserDB获得了用户数据”);
UserDB=JSON.stringify(数据);
UserDBObj=JSON.parse(UserDB);
UserDBObj_isLoaded=true;
//处理所有回调函数直到现在

对于(i=0;i,请在ajax调用完成后尝试调用该函数

$.ajax({

    url: 'services/users?',
    method: 'get',
    headers: { 'Accept': 'application/json' }, 
    success: function(data) {
        console.log ("getUserDB got the user data");
            UserDB = JSON.stringify(data);
            UserDBObj = JSON.parse(UserDB);
        }

}),getUserName());
承诺(jQuery环境中的延迟对象)是处理此类需求的最佳方式。它允许您以忽略xhr调用的特定时间的方式处理异步调用。在下面的代码中,您的ajax调用只被调用一次,从那时起,无论何时调用
getUser
函数,它都只使用xhr调用的缓存结果无需重复。您无需跟踪“是否加载了ajax结果”或诸如此类的内容……承诺会为您做到这一点

ES6上的MDN承诺规范:

jQuery延迟规范(与承诺相同):

var xhrUsers=$.get('/api/users');
函数getUser(id){
返回xhrUsers.then(函数(usersList){
返回usersList[id];
});
}
函数getUserFullName(id){
返回xhrUsers.then(函数(usersList){
返回usersList[id].fullname;
});
}
//范例
getUser('bob').done(函数(用户){
//对用户bob做些什么
});
getUserFullName('jane').done(函数(fullname){
log('用户jane的全名为:'+全名);

})
在收到数据后的成功回拨中调用getUserName(id)。能否请您详细说明一下?
id
是动态的,我需要使用不同的值调用它。如何调用
getUserName(id)
。你能给我们看一下那个代码吗?很好。是的,承诺也在做同样的事情,我想用我的答案概括一下,但要优雅得多。唯一的一点是,它们一开始有点奇怪。
    success: function(data) {
        console.log ("getUserDB got the user data");
            UserDB = JSON.stringify(data);
            UserDBObj = JSON.parse(UserDB);
            UserDBObj_isLoaded = true;

            // process all the callback functions till now
            for (i=0; i<UserDBObj_cbs.length; i++) {
                UserDbObj_cbs[i]();
            }
        }
$.ajax({

    url: 'services/users?',
    method: 'get',
    headers: { 'Accept': 'application/json' }, 
    success: function(data) {
        console.log ("getUserDB got the user data");
            UserDB = JSON.stringify(data);
            UserDBObj = JSON.parse(UserDB);
        }

}),getUserName());