0

关于 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 之前为他们完全填充它。

谢谢,

4

2 回答 2

0

无论您的程序的其余部分是否同步,有时您需要同步触摸 REST 接口。一个示例是,您请求获取一组资产(可能是资产 Id),然后对每个 Id 进行水合以获得完整的数据/资产。如果您使用过 Ooyala API,那么您就会明白我的意思。

我创建了似乎是第一个同步 JSONP 模块,它允许每个下一个请求仅在其前一个请求完成后运行。它使用递归而不是 Promises,这意味着在前一个请求成功之前不会发送下一个请求。API 位于此处:https ://github.com/cScarlson/jsonpsync

希望这可以帮助。

于 2013-10-29T03:53:42.480 回答
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
}
于 2013-02-25T20:50:31.713 回答