2011-05-20 61 views
0

我知道這裏有很多線程,但是我厭惡ajax,並且無法爲我的生活解釋答案。

var loadUrl = "lib/php/ajax.php"; 

$.ajaxSetup ({ cache: false }); 

$.get(loadUrl + href, function(data) 
{ 
    var obj = $.parseJSON(data); 
    console.log(obj.commentCount, obj.fileName);    
}); console.log(obj.commentCount, obj.fileName); // this one doesn't work. 

我如何獲得的功能之外的變量= /我知道我需要首先前var obj使用某種回調函數的..什麼

回答

0

回調在ajax調用完成後執行。您最後的console.log()語句將首先被調用,因爲ajax請求是異步發生的。另一個問題是obj屬於回調的範圍,這使得它在外面不可用。如果您在回調之外聲明它,它將可用但由於第一個問題仍然無法使用。這將是空的,直到ajax調用完成。回調中的工作有什麼問題?

+0

這是有道理的。那就是我最終做的。我做了回調工作 – ionfish 2011-05-20 10:37:46

-1

聲明,在函數外,那麼你就可以將它設置爲裏面的數據,然後在外面引用它。

var loadUrl = "lib/php/ajax.php"; 
var obj = ""; 

$.ajaxSetup ({ cache: false }); 

$.get(loadUrl + href, function(data) 
{ 
    obj = $.parseJSON(data); 
    console.log(obj.commentCount, obj.fileName);    
}); 
console.log(obj.commentCount, obj.fileName); 
+0

這仍然執行和$ .get函數之前,第二的console.log稱爲=/ – ionfish 2011-05-20 08:46:21

+0

這不會作爲第二工作 '的console.log(obj.commentCount,obj.fileName);'將在返回ajax響應之前運行,因此obj不會被設置。 – 2011-05-20 08:47:05

+0

爲什麼在相同的數據外部和外部調用console.log?目的是什麼?也許我可以幫助更多地解釋兩次調用相同數據的預期目的。 – spanky 2011-05-20 08:57:20

2

你不能有兩個原因:

  1. 的$不用彷徨後的代碼立即運行。函數中的代碼僅在ajax響應返回後運行
  2. var obj在內部函數的範圍內創建,因此無法在外部訪問。

你能得到這個工作的唯一方法是申報Ajax請求的OBJ外,分配函數內部的值,並設定了Ajax請求不asyncronous(見jquery Ajax)雖然這有點違背了點使用ajax,並會阻止該網站,直到結果回來。

+0

我已經把async變成false了,但我猜我不應該養成這樣做的習慣嗎?而不是100%真值或假值之間的區別是什麼.. – ionfish 2011-05-20 08:53:44

+0

如果它是假的,那麼在返回ajax響應之前,頁面上沒有其他東西會發生。如果這需要很長時間,瀏覽器可能會凍結。最好的做法是充分利用回調函數來運行依賴ajax結果的代碼。 – 2011-05-20 09:14:12

+0

這應該是被接受的答案... +1! – jwueller 2011-05-20 09:39:33

-1
var loadUrl = "lib/php/ajax.php"; 

function processAjaxResponse(obj) 
{ 
    console.log(obj.commentCount, obj.fileName); 
}; 

$.ajaxSetup ({ cache: false }); 

$.ajax({ 
    type: 'GET', 
    dataType: 'JSON', 
    url: loadUrl + href, 
    success: function(data) { 
     processAjaxResponse(data); 
    } 
}); 
+0

這不會作爲第二個'console.log(obj.commentCount,obj.fileName);'將在返回ajax響應之前運行,因此obj不會被設置。 – 2011-05-20 08:46:38

+0

這個例子還是先調用第二個console.log =( – ionfish 2011-05-20 08:48:45

+0

Whoops,今天沒有想直接更新代碼:) – 2011-05-20 08:52:39