Как передать контекст объекта в обратный вызов JSONP JQuery.ajax? - PullRequest
5 голосов
/ 03 августа 2010

У меня возникают проблемы с передачей контекста объекта javascript в обработчик обратного вызова ajax-запроса JSONP, когда поставщик 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 , из которой я могу получить к ней доступ. Но я не вижу способа, как получить это сгенерированное имя.
  2. Я укажу объект контекста, как я сделал в примере. Документация jQuery утверждает, что этот объект будет доступен для обработчика обратного вызова. Однако я не могу найти, как этот контекст подвергается, например, handleJSON функция из моего примера.

В настоящее время я нашел решение с помощью jquery-jsonp из кода Google. Но все же мне очень любопытно, как решить проблему, как описано в 2. Потому что я думаю, что ссылка jQuery утверждает, что она может быть обработана таким образом. Что делает меня надежным на менее сторонних библиотек.

Может кто-нибудь показать мне, как получить доступ к контексту в обработчике обратного вызова JSONP с помощью jQuery?

1 Ответ

13 голосов
/ 03 августа 2010

Просто оставьте свойство 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();
...