我的功能看起来像
var mail_ntfy=$("#nav_mail"), question_ntfy=$("#nav_question"), users_ntfy=$("#nav_users");
function CheckAll(){
var data=checkFor("m,q,u");
if(mail_ntfy.attr("data-number")!=data.m_count && data.m_count!=0)
mail_ntfy.attr("data-number", data.m_count);
if(question_ntfy.attr("data-number")!=data.q_count && data.q_count!=0)
question_ntfy.attr("data-number", data.q_count);
if(users_ntfy.attr("data-number")!=data.u_count && data.u_count!=0)
users_ntfy.attr("data-number", data.u-count);
showNotes(data.msg);
chngTitle(data.msg);
}
$(document).ready(function () {
setInterval(CheckAll(), 10000);
})
function checkFor(param){
$.ajax({
url: "core/notifications.php",
type: "POST",
dataType: "json",
data: {
chk:param
},
success: function (data) {
if(data.status!="error") {
console.log(data);
return data;
}
}
});
}
我有两个问题:
1)我看到,checkFor
函数返回结果(console.log显示结果)但仍然在第if(mail_ntfy.attr("data-number")!=data.m_count && data.m_count!=0)
行上获取数据是未定义的错误消息。我错过了什么?
2)我想每10秒执行一次CheckAll
。但它不会启动超过1次。为什么setinterval无法正常工作?
答案 0 :(得分:1)
您无法从success
回调中返回数据。相反,您可以通过此成功回调来调用CheckAll
success: function (data) {
if(data.status!="error") {
console.log(data);
//return data;
CheckAll(data);
}
}
要每10秒运行checkFor
,您也可以在成功回调中设置计时器。每次成功的ajax请求后,这将调用checkFor
10秒。使用setInterval
可以最终同时进行多个ajax调用。
success: function (data) {
if(data.status!="error") {
console.log(data);
//return data;
CheckAll(data);
setTimeout(checkFor,10000);
}
}
您更新的checkAll
就像
function CheckAll(data){
if(mail_ntfy.attr("data-number")!=data.m_count && data.m_count!=0)
mail_ntfy.attr("data-number", data.m_count);
if(question_ntfy.attr("data-number")!=data.q_count && data.q_count!=0)
question_ntfy.attr("data-number", data.q_count);
if(users_ntfy.attr("data-number")!=data.u_count && data.u_count!=0)
users_ntfy.attr("data-number", data.u-count);
showNotes(data.msg);
chngTitle(data.msg);
}
答案 1 :(得分:1)
checkFor()
不会返回任何结果。 console.log()
语句位于附加到AJAX请求的success
处理程序的匿名函数中;它的返回 not 从checkFor()
函数返回。
答案 2 :(得分:1)
如果您希望checkFor
返回data
,则AJAX调用必须是同步的。但是,这是一个糟糕的Javascript实践(例如,它将挂起页面上的脚本执行,直到请求完成)。不幸的是,这整个设计存在缺陷,但如果您真的需要,可以使用此代码:
function checkFor(param){
var result;
$.ajax({
url: "core/notifications.php",
type: "POST",
async: false,
dataType: "json",
data: {
chk:param
},
success: function (data) {
if(data.status!="error") {
console.log(data);
result = data;
}
}
});
return result;
}
答案 3 :(得分:0)
您正在异步调用Ajax,因此系统不会等待ajax结束以继续进行处理。你必须添加
async:false,
给你的ajax电话,像这样:
function checkFor(param){
$.ajax({
url: "core/notifications.php",
type: "POST",
async:false,
dataType: "json",
data: {
chk:param
},
success: function (data) {
if(data.status!="error") {
console.log(data);
var ret=data;
}
}
});
return ret;
}
希望它有所帮助!