0

我的功能看起来像这样

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)我想CheckAll每 10 秒执行一次。但它不会启动超过 1 次。为什么 setinterval 不能正常工作?

4

4 回答 4

1

您不能从success回调中返回数据。相反,您可以CheckAll像这样从成功回调中调用

success: function (data) { 
            if(data.status!="error")  {
                console.log(data);
                //return data;                
                CheckAll(data);
            }

        }

checkFor改为每 10 秒运行一次,您也可以在成功回调中设置计时器。这将checkFor在每次成功的 ajax 请求后调用 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);    
}
于 2012-06-04T21:11:54.340 回答
1

checkFor()不返回任何结果console.log()语句位于附加到success您的 AJAX 请求处理程序的匿名函数中;它的返回不会函数返回checkFor()

于 2012-06-04T21:12:57.997 回答
1

如果要checkFor返回dataAJAX 调用必须是同步的。然而,这是一种糟糕的 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;
}
于 2012-06-04T21:16:08.090 回答
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;
}

希望能帮助到你!

于 2012-06-04T21:16:15.257 回答