2012-02-25 70 views
0

我需要幫助,我想創建一個函數,它返回來自AJAX請求的對象,所以我可以從服務器上的數據創建一個新對象,如下所示:如何從服務器返回的JSON數據創建一個JavaScript對象

var foo = bar('api.php?x=y'); 

函數應該將查詢字符串作爲參數,服務器將數據作爲JSON返回。

你能告訴我如何使用jQuery做到這一點,你有任何想法/例子嗎?

我會擴大我的問題,因爲它似乎我做的都是錯的。我想創建一個基於實時數據(股票報價)的Web應用程序,所以它必須不斷地向服務器請求更新的信息。當應用程序初始化時,第一步是獲取要包含的股票的靜態數據(例如股票代碼和發行者),我認爲最好的方法是在服務器上創建一個數據庫,查詢並以JSON形式返回選定的股票數據。下一步是向服務器上的另一個API發出請求,該請求返回所選股票的實時數據(如價格和交易量),當完整數據返回時,它將使用模板引擎呈現爲html。然後,應用程序必須在某個時間間隔內不斷調用第二個API來更新實時數據並再次呈現。你也應該能夠做出新的股票選擇並重新開始這個過程。

我認爲像這樣構建應用程序的最佳方式是將數據放在自定義對象中,該對象具有自己的方法來稍後修改數據(例如排序和篩選),因此如果foo是我的對象股票數據我可以做類似foo.sort()或類似foo.render()的東西來創建數據的html表示。這就是爲什麼我認爲最好的方法是從AJAX調用返回的數據中創建一個對象。 您能否告訴我這是否構建這樣的應用程序的正確方式,或者將我指向正確的方向?

感謝

+2

有jQuery的DOCO此頁面上的例子:http://api.jquery.com/jQuery.getJSON/ - 看到其他的jQuery的Ajax功能的更多信息。請注意,調用函數來獲取數據的想法對於異步Ajax調用來說不太合適,但您可以解決它。 – nnnnnn 2012-02-25 04:09:16

+3

這聽起來很像[您剛纔的問題(http://stackoverflow.com/questions/9271573/creating-custom-javascript-object-from-data-returned-by-jquery-ajax-request) – 2012-02-25 04:14:20

回答

5

如果JSON字符串就是服務器響應,很容易將它轉變成只用JS對象...

var resp_object = JSON.parse(response); 
+4

你不」即使需要這樣做,假設使用jQuery(根據問題的標籤),因爲jQuery Ajax方法自動解析JSON。 – nnnnnn 2012-02-25 04:29:56

6

AJAX是異步的定義,所以它不」特別適合你的問題。我會建議使用jQuery.ajax(see reference)有一個回調來代替:

$.ajax({ 
    url: 'api.php?x=y', 
    dataType: 'json', 
    success: function (foo) { 
    // Do stuff here using 'foo' 
    } 
}); 
+1

查看API參考資料以獲取更多信息:http://api.jquery.com/jQuery.ajax/ – JulioC 2012-02-25 04:15:55

+0

@JulioC新增,謝謝。 – 2012-02-25 04:18:07

+1

*按定義*,AJAX是異步的。不對。它*可以*被同步執行。這就是爲什麼AJAX是一個不好的首字母縮寫詞。 XHR(XmlHTTPRequest)是一個更好的縮寫詞。另請參見:https://developer.mozilla.org/En/XMLHttpRequest/Using_XMLHttpRequest – KooiInc 2012-02-29 06:32:31

4

你在你的方法同步思考。

這意味着,你認爲你的函數調用「欄(‘api.php?X = Y’)」應立即返回檢索到的數據/對象。這有一個缺點,即在等待答案時,瀏覽器中的代碼執行被阻止。

爲了解決這個問題,您需要創建一個異步回調處理程序(使用"jQuery.ajax"時的「成功」處理程序),正如user595228之前指出的那樣。呈現返回信息的代碼將進入該處理程序。

對於問題如何組織代碼,它取決於你的數據的複雜程度和頻率,你使用它在你的應用程序。如果它的複雜,在多個地方被使用,它可能是有意義的創建與輔助函數的數據對象,以避免重複代碼,並把有關數據代碼在一個地方。如果你只在一個地方渲染它們,而你所做的唯一事情就是簡單的排序和顯示,那麼我會將這個邏輯放在一個簡單的函數中,以減少複雜性。

0

您可以創建一個jQuery插件和勾你的對象之中。例如:

var foo = tablesort({}); // tablesort is plugin Jquery 
foo.sort(); 

你需要實現的jQuery插件排序方法,它的意思是:用ajax從服務器獲取數據,並填寫對象的屬性或者做一些

0

是對實時數據被推到你?那麼我的意思是,如果你現在沒有聽到數據,那麼數據就會通過你想要的線路傳出去呢?還是它建立在一個隊列中等待你輪詢它並得到它?

如果你有第一種情況下,你可以有你的服務器從股票服務中獲得的數據和隊列爲你 - 這帶來了質疑,你如何處理多個用戶的隊列。或者,您可以設置websocket(所有瀏覽器中都不支持HTML5)或查看彗星解決方案(可能涉及Flash對象或大量快速輪詢)。

如果有情況二號,那麼你可以使用Ajax搶上可用的定時器的數據塊。您需要使用ajax的異步方面,否則您的屏幕可能會凍結並等待響應。使用類似jquery的東西來幫助你完成這個過程 - 不需要重新發明輪子。

0

我通常喜歡以保持數據的呈現,從數據本身分開。從服務器接收對象後,我建議不要將函數添加到對象中,而是建議傳遞數據對象。

例子:

function renderStockData(data) { 
    // build and return HTML from data 
} 

function loadStockData(url, callback) { 
    $.ajax({ 
    url: url, 
    dataType: 'json', 
    success: callback 
    }); 
} 

// Later that day... 
loadStockData('api?stock=GOOG', function (data) { 
    var renderedHtml = renderStockData(data); 
    // ... 
}); 

這是建議,你要尋找的類型?

相關問題