有很多关于JSONP请求的问题以及它们无法同步生成的事实。大多数解决方法涉及使用回调或ajax请求中的成功函数来执行您想要的操作,但我不认为这对我有用。
背景:我正在使用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();
然后用res中的结果做一些事情。
鉴于我无法执行同步JSONP请求,并且我无法从ajax函数中返回,我无法确定无论如何确保res在用户开始使用之前已完全填充。
谢谢,
答案 0 :(得分: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
}
答案 1 :(得分:0)
无论您的程序的其余部分是否同步,有时您需要同步触摸REST接口。一个例子是你有一个请求获得一组资产(可能是资产ID),然后给每个ID水合以获得完整的数据/资产。如果您使用过Ooyala API,那么您就知道我的意思了。
我创建了似乎是第一个同步JSONP模块,允许每个下一个请求仅在其先前请求完成后运行。它使用递归而不是Promises,这意味着在前一个请求成功之前不会发送下一个请求。 API存在于此处:https://github.com/cScarlson/jsonpsync
希望这有帮助。