通过ajax JSON获取未定义

时间:2011-09-22 16:30:52

标签: javascript jquery json

当我使用Chrome浏览器检查来自Console的日志时,我始终未定义sideType。它不会将数据返回sideType变量。

当我将console.log(sideType);放入sideGroupData()函数时 - 它可以正常工作。

代码:

function sideGroupData(GroupID) {
    $.getJSON("group_data.php",{GroupID:GroupID}, function(j){
          return j;
     });
}

function reloadProduct(productID) {
   $.post("product.php", { productID:productID }, function(data)  {   
                var sideType = sideGroupData(123);
                console.log(sideType);
     });
}

reloadProduct(999);

2 个答案:

答案 0 :(得分:1)

sidegroupdata()函数调用将立即返回 - 它将触发ajax请求并继续执行。这意味着sideType被赋予空值,因为sideGroupData实际上并没有在ajax调用部分之后显式返回任何内容。

你有没有理由在ajax请求中进行ajax请求?修改product.php页面以返回包含单个响应中包含的产品ID和'sidegroupdata'的数据结构会不会更有意义吗?

答案 1 :(得分:1)

这是因为你在关闭中运行你的呼叫。 ajax调用是异步进行的,这意味着即使你正在进行ajax调用,你的代码也会继续移动:

function setVar () {
    var retVal = 1;
    $.ajax(..., function(data){
        retVal = data; //retVal does NOT equal data yet, it's still waiting
    });
    return retVal; //will return 1 every time because code doesn't wait for ajax
}

var someVar = setVar(); // will be 1

如果要返回该值,请包含一个在返回数据时运行的回调函数,并使用提供的数据运行它,如下所示:

function sideGroupData(GroupID, callback){
    $.getJSON('group_data.php', {GroupID: GroupID}, callback);
}

function reloadProduct(productID) {
   $.post("product.php", { productID:productID }, function(data)  {   
            sideGroupData(123, function(sideType){
                console.log(sideType);
        });    
    });
}

或者,只需在函数内部进行调用:

function reloadProduct(productID, groupId) {
   var prod, sideType;
   $.post("product.php", { productID:productID }, function(data)  {   
        prod = data;
        $.getJSON('group_data.php', {GroupID: groupId}, function(json){
            sideType = json;
            // you now have access to both 'prod' and 'sideType', do work here
        });
   });
}