2013-02-24 216 views
0

關於JSONP請求以及它們不能同步生成的事實,存在很多問題。大多數解決方法都是使用回調函數,或者在ajax請求中使用成功函數來完成您想要的任務,但我認爲這不適用於我。同步JSONP請求

背景:我正在使用Solr開展搜索應用程序。我正在開發一個JavaScript API供其他人用來與Solr交互,因此他們不需要了解Solr搜索請求的來龍去脈。

在我的api中,我有一個Request對象,帶有一個名爲doRequest的函數。該函數的目的是執行對solr服務器的調用(在另一個域上,因此需要JSONP),並返回一個Response對象。

Request.prototype.doRequest = function(){ 
var res = new Response(); 
$.ajax({ 
    url: this.baseURL, 
    data: 'q=*:*&start=0&rows=10&indent=on&wt=json', 
    success: function(data){ 
     res.response = data.response; 
     res.responseHeader = data.responseHeader; 
     /* 
      other... 
      stuff... 
     */ 
    }, 
    dataType: 'jsonp', 
    jsonp: 'json.wrf' 
}); 
res.request = this; 
return res; 
}; 

「用戶」將使用此功能是這樣的...

var req = new Request(); 
var res = req.doRequest(); 

,然後做一些事情或其他與資源的結果。

鑑於我無法做一個同步的JSONP請求,並且我不能從ajax函數中返回,所以我無法弄清楚確保res在用戶開始使用前完全填充。

感謝,

+3

爲什麼你需要保護你的用戶不必編寫回調函數?如此多的Javascript需要了解如何異步執行操作,您只能屏蔽這些長久以來的新手...... – 2013-02-24 20:42:58

+0

異步是具有傳染性的。一旦控制流程的一部分使用回調,其他控制流程也會如此。恐怕沒有辦法解決這個問題。 Javascript的樂趣和恐怖之一。 – 2013-02-24 20:45:08

+0

實際上有一個解決方法,但它需要編譯步驟:https://npmjs.org/package/streamline – 2013-02-24 21:10:19

回答

0

它看起來像使用回調函數是這樣做的方法。如果你有興趣,我最終會這樣做。

Request.prototype.doRequest = function (callback){ 
var res = new Response(); 
$.ajax({ 
    url: this.baseURL, 
    data: 'q=*:*&start=0&rows=10&indent=on&wt=json', 
    success: function(data){ 
     res.response = data.response; 
     res.responseHeader = data.responseHeader; 
     res.request = this; 
     /* 
      other... 
      stuff... 
     */ 
     callback(res); 
    }, 
    dataType: 'jsonp', 
    jsonp: 'json.wrf' 
}); 
}; 

現在用戶使用功能,如下所示:

var req = new Request(); 
var res = req.doRequest(parseResults); 

凡parseResults是通過使用帶響應對象作爲參數的用戶定義的回調函數。

function parseResults(res){ 
    //Doing work 
} 
0

無論你的程序的其餘部分是同步的,還有當你需要同步觸摸REST接口次。一個例子是你有一個請求獲得一系列資產(可能是資產ID),然後水化每個ID以獲得完整的數據/資產。如果您使用了Ooyala API,那麼您明白我的意思。

我創建了什麼似乎是第一個同步JSONP模塊,以允許每個下一個請求只在其先前的請求完成後才運行。它使用遞歸而不是Promises,這意味着下一個請求將不會被髮送,直到前一個請求成功。 API住在這裏:https://github.com/cScarlson/jsonpsync

希望這會有所幫助。