2012-03-15 57 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後才被調用。