2013-09-23 82 views
1

如果這是一個重複的問題,我很抱歉。我已經完成了我的研究,但我仍然無法想出一個答案:JSONP回調不按順序

我在寫一個小的JSONP API。期望的結果:

  1. 程序員創建JSON類的實例。

    var json = new jsonpRequest (
    
    "http://url.to.web_service", 
    
    searchParam //passed in as an associative array 
    
    ); 
    
  2. 程序員然後宣佈var myJSON = jsonpRequest.getJsonP()

這將返回JSONP入myJSON變量進行處理。

的API成功發生在當被構造的類的實例中的參數,生成鏈接到服務瓦特/所需的參數,並使用該函數它通過腳本標記注入到DOM:

jsonpRequest.prototype.fetchJsonp = function(){ 

    var request = that.getRequest(); 

    //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.head.appendChild(jsonpCall); 


}; 

編輯:爲了清楚起見:這肯定會返回請求的數據集。

我使用作爲我的回調函數是:

jsonpRequest.prototype.processCallback = function(data){ 

    alert(data); 
    that.setListOfResults(data); 

}; 

這就是所謂的鏈接爲:&callback=jsonpRequest.prototype.processCallback

processCallback功能採用數據從一個變量的請求,並將其存儲在課堂上使用setListOfResults函數。

數據存儲完成後,我想將請求中的數據返回到myJSON變量。這是getJsonp功能,程序員在此過程中的步驟2調用:

jsonpRequest.prototype.getJsonp = function(){ 

    that.buildRequest(); 
    that.fetchJsonp(); 

    return that.listOfResults; 

}; 

問題:

這裏是我打電話後,我確定我的JSON API類:

  var myJSON = json.getJsonp(); 

     console.log(myJSON); 

由於它是異步的,它在調用回調函數之前移動到控制檯日誌,導致MYJSONundefined。我不知道如何將我的代碼以這種方式連接起來,然後再繼續前進。

我試圖效仿How can I get this JSONP call to return a value?的解決方案。我可能會錯過一個步驟,或者我可能對某些事情一無所知!任何幫助澄清這將不勝感激。先謝謝你 :)。

P.S.我想避免使用JQuery等......將它嚴格保存爲原始JavaScript是有益的。

+0

爲了查看'myJSON'的值,您必須等到服務器響應返回。嘗試使用'setTimeout'進行測試。您無法使用異步數據設置變量並立即預期結果。 – hitautodestruct

+0

嘿有hitautodestruct,謝謝你的建議:)。我意識到'setTimeout'是一個可能的解決方案。這是一個非常有效的解決方案。但是,我不願意在http://stackoverflow.com/questions/17465011/how-can-i-get-this-jsonp-call-to-return-a-value中的Relfor點之後這樣做。不過,如果服務器沒有響應,我也許可以實現'setTimeout'作爲失敗保護。謝謝! – Mark

+0

嘿,只是一個FYI的setTimeout不是一個好的解決方案,因爲你永遠不知道到底需要多少時間來服務器響應。我只是爲了測試目的而提出它。 – hitautodestruct

回答

2

我不確定如何將我的代碼以菊花鏈方式連接在一起,然後再繼續前進。

你不能那樣做。你必須依靠回調。將callback參數添加到您的jsonpRequest構造函數中,然後在執行setListOfResults(data)後調用該回調。您可能還希望允許設置將執行回調的上下文this

jsonpRequest.prototype.processCallback = function(data){ 

    alert(data); 
    that.setListOfResults(data); 
    that.callback.apply(that.context, [data]); 

}; 
+0

謝謝!這非常有道理 - 讀完之後我有一段時間了,它使這個過程變得更有意義。我實現了代碼,去試試看,服務器似乎已經停止了!哈哈。我會盡快檢查代碼,如果一切正常,我會將其標記爲已回答:) – Mark

+0

像魅力一樣工作。非常感謝您幫助我在頭腦中完成這個過程:)。 – Mark