2013-02-24 163 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

希望这会有所帮助。