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());