2012-03-15 55 views
0

我有下面的函数错误,它开始真正的痛苦。Jquery post后的痛苦的jquery错误

由于某些原因,它是saing postData没有在标有错误的行上定义。但我已经定义postData并用get.php返回的json填充它?这里有什么缺失吗?

<script> 
function postToFeed(shoeID) { 

    $.post("get.php",{id: shoeID}, 
       function(data){ 
           var postData = data; 
           }, "json"); 

    var obj = { 
     method: 'feed', 
     link: 'https://developers.facebook.com/docs/reference/dialogs/', 
     picture: 'http://fbrell.com/f8.jpg', 
     name: postData.title, //ERROR 
     caption: '<?=SHARE_CAPTION?>', 
     description: postData.description //ERROR 
    }; 

    function callback(response){ 
     if(response['post_id']){ 
      $.post("vote.php",{id: '<?=(isset($_POST['fbid'])? $_POST['fbid'] : $data['id'])?>', shoe: shoeID, type: 'share'}, 
          function(score){ 
          $("#shoe_"+shoeID).html(score) 
          }); 
     } 
    } 

    FB.ui(obj,callback); 
    } 
</script> 
+1

也许googling _“JavaScript范围”_可以帮助你更多。 – gdoron 2012-03-15 15:28:20

+0

调用是异步的吗?如果是这样,那么答案都没有实际的工作。 – pimvdb 2012-03-15 15:29:13

回答

2

既然你已经交的成功处理程序中定义它,它是不可访问。在外部范围内定义postData它将正常工作。

function postToFeed(shoeID) { 
    var postData;// 
    $.post("get.php",{id: shoeID}, 
       function(data){ 
           postData = data; 
           }, "json"); 

.... 
.... 

在这里还需要注意一点。您正在使用$.post,它会异步调用ajax,所以即使您在外部作用域中定义了postData,它也将不起作用,因为在执行该请求之前,postData为空或空。

因此,您应该执行$.post成功处理程序中的其余代码。尝试这个。

function postToFeed(shoeID) { 

    $.post("get.php",{id: shoeID}, function(data){ 
     var postData = data; 
     var obj = { 
      method: 'feed', 
      link: 'https://developers.facebook.com/docs/reference/dialogs/', 
      picture: 'http://fbrell.com/f8.jpg', 
      name: postData.title, //ERROR 
      caption: '<?=SHARE_CAPTION?>', 
      description: postData.description //ERROR 
     }; 

     function callback(response){ 
     if(response['post_id']){ 
      $.post("vote.php",{id: '<?=(isset($_POST['fbid'])? $_POST['fbid'] : $data['id'])?>', shoe: shoeID, type: 'share'}, 
          function(score){ 
          $("#shoe_"+shoeID).html(score) 
          }); 
     } 
     } 

     FB.ui(obj,callback); 

    }, "json"); //$.post-End 

} 
2

移动POSTDATA回调外,使它里面obj访问..

var postData; 
$.post("get.php",{id: shoeID}, 
      function(data){ 
       postData = data; 
      }, 
      "json"); 
1

你不应该在内部函数中定义它,外面定义,并仅在该函数赋值

<script> 
var postData; 
function postToFeed(shoeID) { 


$.post("get.php",{id: shoeID}, 
      function(data){ 
          postData = data; 
          }, "json"); 

var obj = { 
    method: 'feed', 
    link: 'https://developers.facebook.com/docs/reference/dialogs/', 
    picture: 'http://fbrell.com/f8.jpg', 
    name: postData.title, //ERROR 
    caption: '<?=SHARE_CAPTION?>', 
    description: postData.description //ERROR 
}; 

function callback(response){ 
    if(response['post_id']){ 
     $.post("vote.php",{id: '<?=(isset($_POST['fbid'])? $_POST['fbid'] : $data['id'])?>', shoe: shoeID, type: 'share'}, 
         function(score){ 
         $("#shoe_"+shoeID).html(score) 
         }); 
    } 
} 

FB.ui(obj,callback); 
} 
</script> 
0

你只需要重新安排你的代码一点点:

function postToFeed(shoeID) { 
    function callback(response) { 
     if (response['post_id']) { 
      $.post("vote.php", { 
       id: '<?=(isset($_POST['fbid'])? $_POST['fbid'] : $data['id'])?>', 
       shoe: shoeID, 
       type: 'share' 
      }, function(score) { 
       $("#shoe_" + shoeID).html(score) 
      }); 
     } 
    } 

    $.post("get.php", { 
     id: shoeID 
    }, "json").done(function(postData){ 
     var obj = { 
      method: 'feed', 
      link: 'https://developers.facebook.com/docs/reference/dialogs/', 
      picture: 'http://fbrell.com/f8.jpg', 
      name: postData.title, 
      caption: '<?=SHARE_CAPTION?>', 
      description: postData.description 
     }; 
     FB.ui(obj, callback); 

    }); 
}​ 

请注意obj是如何构建的,FB.ui()仅在原始$.post()done后才被调用。