Как заставить jQuery передавать пользовательские аргументы асинхронным функциям обратного вызова AJAX? - PullRequest
5 голосов
/ 09 января 2009

Моя страница имеет дело со многими объектами «Store», у каждого из которых есть поле с именем «data». Однако эти данные выбираются с помощью запросов AJAX, которые могут выполняться параллельно.

function Store(id){
    this.id = id;
    this.queryparam = 'blah';
    this.items = null;
}

Store.prototype.fetch = function(){
    $.get("/get_items",{q:this.quaryparam},function(data,status){

      // how to store the received data in this particular store object? Being
      // a callback function, I don't have a reference to this object as 'this'

       // this.data = data; //will not work
    });
}

В функции обратного вызова я попытался определить параметр по умолчанию для вызывающих объектов следующим образом:

$.get("/get_items",{q:this.quaryparam},function(data,status, ref = this) ...

Но оказывается, что javascript не поддерживает значения аргументов по умолчанию, подобные этому. Могу ли я как-нибудь заставить jquery передать ссылку на это хранилище в функцию обратного вызова?

Я подумал о паре других подходов, но ни один из них не работает:

Я мог бы установить данные хранилища, используя синхронные запросы, но тогда это не суть AJAX, не так ли?

Другим способом для меня может быть отправка идентификатора магазина также в запросах, которые будут возвращаться в ответе. Например:

// in Store.fetch()
$.get("/get_items",{q:this.quaryparam,id:this.id},function(responsetext,status){
    var response = eval(responsetext);
    stores[response.id].data = response.data;
});

Мне не нравится этот подход, потому что он загрязняет ответ только потому, что клиентскому коду не удалось отследить, какой запрос каким объектом был отправлен.

Более того, поскольку store.id зависит от клиента, он также может испортить кэширование на сервере. Различный URL-адрес запроса будет использоваться для двух разных магазинов, даже если они имеют одинаковые параметры запроса.

Есть ли другой способ добиться того, чего я хочу?

Ответы [ 4 ]

5 голосов
/ 09 января 2009

Вы должны быть в состоянии использовать замыкание:

var tmp = this;
$.get("/get_items",{q:this.quaryparam},function(data,status){
    tmp.data = data;
});

Это то, что вы имеете в виду?

2 голосов
/ 09 января 2009

функция Store (id) { this.id = id; this.queryparam = 'бла'; this.items = null; }

Store.prototype.fetch = function(){
    var that = this;
    $.get("/get_items",{q:this.quaryparam},function(response){
        that.callback(response)
    });
}

Store.prototype.callback = function(response){
    // and here you can use
   this.items = response // just example
}
0 голосов
/ 17 апреля 2009

Я написал этот плагин, думаю, он будет полезен

http://code.google.com/p/jquerycallback/

0 голосов
/ 09 января 2009

Кажется, что работает, хотя я не понимаю, как переменная 'tmp' доступна внутри анонимной функции. : -)

Спасибо, Марк и Рикардо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...