我的数据库中有以下表格:
+-----------+-------------+------+-----+---------+----------------+
| 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页面,应根据fullname
在各个地方(div)显示id
。
为了避免为每个div
触发jQuery,我想我可以在页面加载时存储响应并使用另一种方法来获取fullname
。
这是我写的:
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;
}
我为必须显示名称的相应div调用getUserName(id)
。
但是这没有用,因为ajax调用是异步的,即使在获取数据之前也会调用getUserName(id)
。
有任何建议如何实现这一目标?我看到过类似的问题,但没有一个问题得出结论。
答案 0 :(得分:1)
尝试在ajax调用完成后调用该函数
@font-face {
font-family: 'Open Sans';
...
}
答案 1 :(得分:1)
Promises(jQuery环境中的延迟对象)是处理这类需求的最好方法。它允许您以一种允许您忽略xhr调用的特定时间的方式处理异步调用。在下面的代码中,你的ajax调用只被调用一次,从那时起,每当你调用getUser
函数时,它只是使用xhr调用的缓存结果而不重复它。您无需跟踪'是否加载了ajax结果'或类似的......承诺为你做的。
关于ES6的MDN承诺规范: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
jQuery延迟规范(与Promises相同的想法): https://api.jquery.com/category/deferred-object/
var xhrUsers = $.get('/api/users');
function getUser(id) {
return xhrUsers.then(function(usersList) {
return usersList[id];
});
}
function getUserFullName(id) {
return xhrUsers.then(function(usersList) {
return usersList[id].fullname;
});
}
//example
getUser('bob').done(function(user) {
//do something with user bob
});
getUserFullName('jane').done(function(fullname) {
console.log('user jane\'s full name is: ' + fullname);
});

答案 2 :(得分:0)
加载后执行数据处理例程。
这样的事情(你必须更换' myDivSelector'):
function populateUsers() {
$(myDivSelector).each(function () {
var name = getUserName(this.id);
//handle user name
});
}
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);
populateUsers();
}
}));
}
答案 3 :(得分:0)
你基本上可以做的(不改变应用程序的一般行为)是使getUserName函数也异步,因为它依赖于异步事件。
一种可能性,可以这样看:
(我只给出一个大纲,而不是完整的代码)
function setUsername(ID, divId) {
if (UserDBObj_isLoaded) {
// do as before
}
else {
// set callback function that will be called from the
// ajax-call success handler
var cb = function() {
// get the value for the name
...
// set the name into the divId
...
}
UserObj_cbs.push(cb);
}
}
这里仅是成功处理程序的概述:
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]();
}
}