同步JSONP请求

时间:2013-02-24 20:39:47

标签: javascript ajax jsonp synchronous

有很多关于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在用户开始使用之前已完全填充。

谢谢,

2 个答案:

答案 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

希望这有帮助。