如何将对象上下文传递给jQuery.ajax JSONP回调函数?

6
我在将一个javascript对象上下文传递到JSONP ajax请求的回调处理程序时遇到了问题,当ajax提供程序预定义其回调时(Flickr是服务提供者)。
我将给出一个简化的示例:
``` function Person(anId) { this.name; this.id = anId; var self = this; this.loadName = function() { $.ajax({ url: "jsonp.json", dataType: "jsonp", jsonpCallback : "handleJSON", data : {id: this.id}, context: self, success: function (data) { self.name = data.name; } }); } }
var handleJSON = function(data) { console.log("received " + data.name ); }
var a = new Person(234); a.loadName(); var b = new Person(345); b.loadName(); ```
以上示例运行完美,控制台输出了handleJSON函数的内容。但是在这个函数中,我没有对调用它的原始对象的引用。我想让`success`函数被调用,这样我就可以引用`self`变量。
有几种可能的解决方案,但我没有找到任何一种能够运行的方法。
1. 我会拦截jQuery为我生成的回调名称,并将其作为jsonpCallback参数的值放置。我认为这个函数会委托给指定的`success`函数,从这个函数中我可以访问到`this`。但我看不到如何获取生成的名称。 2. 我会像在示例中所做的那样指定上下文对象。jQuery文档说明这个对象将可用于回调处理程序。但我找不到如何将此上下文暴露给例如`handleJSON`函数。
目前,我在谷歌代码中找到了使用jquery-jsonp的解决方案。但我仍然非常好奇如何解决上述第2点描述的问题。因为我认为jQuery参考文献说明可以像这样处理。这使我对第三方库更加依赖。
有人能向我展示如何使用jQuery访问JSONP回调处理程序中的上下文吗?
1个回答

13

只需保持jsonpCallback属性不变,让jQuery创建被调用的函数和它的函数名。该函数将使用您指定的上下文调用您指定的成功回调函数。

function Person(anId) {
 this.name;
 this.id = anId;
 this.loadName = function() {
  $.ajax({
   url: "jsonp.json",
   dataType: "jsonp",
   data : {id: this.id},
   context: this,
   success: function (data) {
    this.name = data.name;
   }
  });
 }
}

var a = new Person(234);
a.loadName();
var b = new Person(345);
b.loadName();

感谢您的快速回复。您的答案似乎很琐碎,但我的服务提供商总是在自己的回调中包装JSON:jsonFlickrApi({json}),并且生成的回调jQuery名称被忽略。如果您提供参数“jsoncallback = handleJSON”,则可以影响回调名称,但这也不是一个选项,因为那样我只能传递全局作用域函数名,而我需要传递对象作用域函数名。 - TheHobbyist
1
@TheHobbieist:在这种情况下,您可以使用jsonpCallback属性将'jsonFlickrApi'指定为函数名称,但不要创建该函数。 ajax方法会为您创建该函数。 - Guffa
2
上一条评论中解释的解决方案是可行的,但它会生成错误,指出回调函数不存在... - Etienne Desgagné

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接