2013-11-15 54 views
0

如果這是一個重複的問題,我會很樂意被重定向到答案:)。jQuery.ajax():無法訪問兩個返回的json對象(jsonp)

一些背景資料:

我有一個小物件,處理JSONP請求。這段代碼執行時

直到最近,我用的是純JavaScript這樣處理的請求......

this.fetchJsonp = function(){ 

    //the 'request' variable holds the URL and parameters for the request. 

    var request = this.request; 

    //creates a script element 

    var jsonpCall = document.createElement('script'); 

    //gets jsonp request 
    jsonpCall.src = request; 

    //adds script to DOM, which goes on to request the JSONP from the service. 
    document.getElementsByTagName('head')[0].appendChild(jsonpCall); 

}; 

後,回調函數被調用和JSONP對象傳遞給它。由於被稱爲服務設置方式,服務發送我在這個格式2個JSONP對象:

callbackWrapperFunc({"arrayName":[{item1:"hello",item2:"world"}]}, {anotherImportantItem:"!"}); 

我可以傳遞這些對象爲這樣的回調函數...

this.myCallBackFunction(firstObject, secondObject){ 

    //manipulate data here 

} 

問題:

因爲我已經改變了我的方法,現在我使用jQuery來處理JSONP請求,因爲它讓我更容易地處理錯誤。

//snippet of my jQuery ajax call: 

jQuery.ajax({ 
     url: this.request, 
     type: 'get', 
     dataType: 'jsonp', 

     success: function(firstObject, secondObject) { 

         //manipulate data here 

       } 

     }); 

我知道,傳遞到「成功」的參數不會以同樣的方式爲我的原代碼,因爲jQuery的Ajax對象返回第二個和第三個參數作爲textStatus(詳細介紹了呼叫是否是成功的工作或失敗)和jqXHR對象。

讓我訪問數據的第一個參數只讓我可以訪問第一個JSON對象,而不是第二個參數。我似乎無法找到訪問第二個對象的方法(我也嘗試通過對象「循環」但無濟於事:也許我做錯了?)。

這可能是非常簡單的瞭解我!任何幫助將不勝感激!

+0

如何在服務器端腳本中發送兩個JSON對象?!!?你爲什麼不在數組中發送兩個對象?像這樣:[{..},{..}] – Mohebifar

+1

儘管你正在做的事情是完全可能的,由於某種原因,JSONP已經發展成預期/假設(通過沒有技術限制!),只有單個參數將被傳遞給回調函數。正因爲如此,我不會驚訝(沒有時間檢查源代碼),如果jQuery只是普通*不處理這個;你可能不得不考慮@ Mohebifar傳遞一個包含兩個對象的單個數組的方法,或者傳遞一個父對象,其中的兩個對象都是屬性。 – Matt

+0

嗨,大家好。這是我害怕自己。我將不得不考慮@ Mohebifar的建議。感謝您的快速回復。 – Mark

回答

0

我設法想出了一個解決方案。感謝@Matt的靈感。

趕超...

這的確看起來像jQuery的限制,正如指出的那樣,接受一個JSON對象爲回調函數,貌似,預期的常態。

如果你在我的位置上,並想通過網絡服務來接受一個或多個JSON對象步入回調我開發了一個小的解決方案:

解決方案

我不再使用jQuery,我使用的是從Web服務調用JSON對象的原始方式。

在我的JSON處理程序對象中,我寫了一個自定義回調函數,它接受多個JSON對象並將它們處理爲一個對象以方便使用。

this.processJSON = function(){ 

     //places any number of arguments (json objects) from the service into one JSON object. 

     var data = {}; 

     for(var i = 0; i <= arguments.length; i++){ 

      data[i] = arguments[i]; 

     }; 

     that.callback(data); //sends data to user designated callback 

    }; 

該功能簡單地讀取多少arguments(在這種情況下,JSON對象)被放入該函數的arguments陣列和它們全部處理成一個data對象。

然後,您可以將它發送到任何你想要的地方。

請注意,調用此函數進程的回調函數必須是全局的,以便在正確的範圍內進行識別。舉例來說,我實現了它通過把這個功能我的JSON處理對象中:

window.jsonCallback = function(){ 

     //this function is executed if the script is successful 
     that.call = true; 
     that.processJSON(arguments); 

    }; 

實例調用Web服務:

www.myservice.com/service?value="something"&callback=jsonCallback

that指的JSONObject的範圍,因此它知道在哪裏尋找被調用的函數。變量call用於處理錯誤(我也找到了一個沒有jQuery的解決方案),但不在此答案的範圍內。

我希望這可以幫助任何希望處理多個JSON對象從Web服務傳遞到應用程序的人。

0

爲什麼不在JavaScript中使用PageMethod調用並構造一個值對列表來發回?

+0

你好:)。我相信PageMethods對ASP.NET來說是獨一無二的,而我並沒有使用它。不過,謝謝你的建議。 – Mark