2013-07-29 31 views
0

我打算從MYSQL訪問記錄集並在Javascript中處理日曆組件。因此我使用PHP獲取記錄並將其作爲json記錄數組轉儲到平面文件中。現在,我試圖通過從JavaScript JavaScript文件閱讀這個JSON,但我面臨的問題很少。訪問數據從PHP到javascript

var event_list; 
$.getJSON("testFile.json", function(json) { 
alert("fetching"); 
event_list= jQuery.extend(true, {}, json); 
alert(json); 
event_list=json; 
alert(JSON.stringify(event_list)); // This echo's me the data 
}); 
alert(JSON.stringify(event_list)); // But this doesn't ??? 

我無法訪問getJSON()例程範圍之外的數據。

如果有人可以幫我解決這個問題,那將會很棒。

+0

的可能重複[如何返回Ajax響應文本?](http://stackoverflow.com/questions/1225667/how-to-return-ajax-response-text) – Quentin

+1

@Quentin從理論上講,它是(因爲問題的根源是一樣的),但問題的海報本身並不能找到這個問題,因爲它與他自己沒有其他相似之處。 – lazyCrab

回答

1

你可以利用異步屬性設置爲false和全球屬性爲false,這將有助於您的要求。

var data; 
data= function() { 
var tmp = null; 
$.ajax({ 
    'async': false, 
    'type': "POST", 
    'global': false, 
    'dataType': 'html', 
    'url': "fetch_data.php", 
    'data': { 'userid': "19"}, 
    'success': function (json) { 
     tmp = json; 
    } 
}); 
return tmp; 
}(); 

alert(data); //would give you the json data from PHP 
+0

謝謝siva。它確實工作完美! :) – deeshank

1

因爲它是異步調用,不是同步的。外部調用在Ajax調用被創建/返回之前正在讀取變量。您需要完成回調中的所有工作。

2

您不能在回調之外訪問提取的JSON,因爲它綁定到回調的範圍,回調的範圍可能是也可能不是異步的(在這種情況下是)。

然而,您可以通過使用Deferred(又名Promises/A隱藏範圍。

jQuery有這樣對它的支持:

var request = $.getJSON("testFile.json"); 
request.done(function (data) { 
    console.log(data); 
}); 

所以現在request是保存你的要求的價值承諾。

在全球範圍內沒有(好的)方法使數據可用同步

+0

我得到這個錯誤: Uncaught TypeError:Object#沒有方法'完成' – deeshank

+1

您使用的是舊版本的jQuery?目前的版本似乎支持Deferreds:http://api.jquery.com/jQuery.getJSON/ – Halcyon

1

JQuery使用AJAX加載JSON文件,而AJAX是異步的。

因此,發生的情況是getJSON之後的行首先被調用,而JSON文件仍在被加載,並且回調尚未被調用。

這就是爲什麼event_list仍未定義,並且不返回任何數據。