Моя страница имеет дело со многими объектами «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-адрес запроса будет использоваться для двух разных магазинов, даже если они имеют одинаковые параметры запроса.
Есть ли другой способ добиться того, чего я хочу?