首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在OpenCalais SemanticProxy服务的jQuery.ajax中指定回调

在OpenCalais SemanticProxy服务的jQuery.ajax中指定回调
EN

Stack Overflow用户
提问于 2010-08-06 18:34:36
回答 2查看 412关注 0票数 1

我正在尝试查询OpenCalais服务semanticproxy.com。不幸的是,它们的url格式如下:

代码语言:javascript
复制
http://service.semanticproxy.com/processurl/APIKEY/jsonp:handler_function/http://en.wikipedia.org/wiki/Germany

注意到函数回调不是在callback=中吗?参数,而是遵循响应格式(jsonp:)。这意味着我不能使用.getJSON,而需要使用.ajax方法。因此,我有以下对象定义:

代码语言:javascript
复制
function Subject() {
}

Subject.prototype.populate = function(page_title) {
  var url = "http://service.semanticproxy.com/processurl/APIKEY/jsonp:handler/http://en.wikipedia.org/wiki/" + page_title;
  $.ajax({url: url, dataType: "script", type: "GET", cache: false, callback: null, data: null});
};

var handler = function (data) {
  // do stuff with the returned JSON
};

s = new Subject();
s.populate("Germany");

这可以很好地工作。但我真正想做的是设置我的Subject对象的属性。但是我不知道如何在主题的上下文中创建一个能够用作回调的函数。即:

代码语言:javascript
复制
Subject.prototype.handler = function(data) { this.title = data.title } 

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-08-06 18:56:48

您必须在window对象上设置一个函数。这本质上(我认为)是jQuery对其.getJSON方法所做的事情。下面的内容有点老生常谈,但希望它能为你指明正确的方向:

代码语言:javascript
复制
function Subject() {
}

Subject.prototype.populate = function(page_title) {
    // Save context object
    var subject = this;
    // Create function name like subjectHandler1281092055198
    var functionName = "subjectHandler" + new Date().getTime();
    window[functionName] = function(data) {
        // Invoke function with saved context and parameter
        subject.handler.call(subject, data);
    }
    var url = "http://service.semanticproxy.com/processurl/APIKEY/jsonp:" + functionName + "/http://en.wikipedia.org/wiki/" + page_title;
    $.ajax({url: url, dataType: "script", type: "GET", cache: false, callback: null, data: null});
};

Subject.prototype.handler = function (data) {
  // do stuff with the returned JSON
};

s = new Subject();
s.populate("Germany");
票数 1
EN

Stack Overflow用户

发布于 2010-08-06 18:39:48

我不认为你能够做到这一点,因为JSONP是如何工作的,看看它实际上是如何返回到浏览器的,它基本上是这样做的:

代码语言:javascript
复制
<script type="text/javascript">
  handler({ title: "Germany", ...other properties... });
</script>

这里没有办法维护引用,您可以一次执行一个请求,或者为每个主题保留一个对象映射,但在JSONP请求中无法做到这一点。

对象映射将如下所示:

代码语言:javascript
复制
//delcare this once for the page
var subjects = {};

//do this per subject
var s = new Subject();
s.populate("Germany");
subjects["Germany"] = s;

然后,在您的处理程序中,如果有任何data属性为"Germany",则可以通过这种方式获取它,例如:

代码语言:javascript
复制
var handler = function (data) {
  var subject = subjects[data.title];
  //subject is  your Germany subject, use it, go nuts!
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3422938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档