2010-05-19 64 views
2

我無法傳遞從$ .post()函數中獲取的數據以在代碼中的其他位置使用。我想將數據保存爲一個變量並在post()函數之外使用它。這是我的代碼:

var last_update = function() { 
$.post('/--/feed', 
{func:'latest', who:$.defaults.login}, 
function($j){ 
      _j = JSON.parse($j);  
      alert(_j.text); // This one works  
     }); 
} 
alert(_j.text); // This one doesn't 
}; 

last_update(); //run the function 

請幫忙!

+0

在第二次提醒中,_j是未定義的,所以'_j.text'試圖訪問'undefined'上的一個屬性,該屬性失敗。您是否有特別需要在AJAX回調之外運行代碼,而不是將其放置在內? – user113716 2010-05-19 21:04:10

回答

1

如果您想要訪問ajax請求回調之外的數據值,您需要將該代碼放入函數中,並從成功回調中調用它。

var last_update = function() { 
$.post('/--/feed', 
{func:'latest', who:$.defaults.login}, 
function($j){ 
      _j = JSON.parse($j);  
      alert(_j.text); // This one works 
      someOtherFunc(_j.text); 
     }); 
} 
}; 

last_update(); //run the function 

function someOtherFunc(val) { 
    alert(val) 
} 

基本相同,配股代碼回調,但如果你有一些代碼在別處重複使用可能是有用的。

+0

謝謝,我認爲這樣做! – 2010-05-19 21:16:58

+0

@James Bao - 不客氣。很高興它的作品。 – user113716 2010-05-19 21:19:48

-1

last_update函數的範圍內創建_j

+0

它看起來像_j是全球性的。但問題是異步性,而不是範圍。 – 2010-05-19 20:33:31

+0

我以爲他的問題是如何使_j變成一個閉包變量。 – 2010-05-19 20:44:25

+0

然後你沒有仔細閱讀這個問題。 – 2010-05-19 20:48:53

3

$.post() AJAX調用是異步的 - 這意味着AJAX請求的順序與通常的程序執行無關,並且在您的程序中意味着在填充_j之前調用第二個警報。執行的順序是:

  1. 調用LAST_UPDATE()
  2. 使Ajax請求,記得要執行的回調函數,而不是現在
  3. 調用中的第二警報(_j.text);
  4. 當AJAX請求返回的數據,執行回調函數

此舉利用AJAX數據返回到success()函數的代碼(這是你的回報功能function($j)這裏) - 什麼成功的功能是。

$.post()是對$.ajax()的別名調用 - 完整文檔here

+0

謝謝,我想知道的是如何在成功函數外使用返回的數據。有什麼建議麼? – 2010-05-19 20:44:35

+0

您必須將利用AJAX返回數據的代碼移動到'success()'函數 - 數據不會返回到該腳本,直到該階段 – Andy 2010-05-19 20:47:40

0

你可以讓你的POST請求同步,並有一個全球性的_J變量:

// global!!! 
var _j; 

$.ajax({ 
    async: false, 
    url: '/--/feed', 
    data: { func:'latest', who:$.defaults.login }, 
    success: function($j) { 
    _j = JSON.parse($j);  
    alert(_j.text); // This one works 
    } 
}); 

function last_update() { 
    if (typeof _j != 'undefined') { 
    alert(_j); 
    } 
} 

或者你可以簡單地從你的成功回調中調用LAST_UPDATE(),從而不再需要異步:

$.ajax({ 
    url: '/--/feed', 
    data: { func:'latest', who:$.defaults.login }, 
    success: function($j) { 
    _j = JSON.parse($j);  
    alert(_j.text); // This one works 
    last_update(_j); 
    } 
}); 

function last_update(_j) { 
    alert(_j); 
}