变量是未定义的错误(即使console.log显示变量)

时间:2012-06-04 21:10:17

标签: javascript jquery ajax

我的功能看起来像

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无法正常工作?

4 个答案:

答案 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;
}

希望它有所帮助!