Temos vários editores Wysiwyg na página, todos obtendo uma lista JSON de imagens do servidor que é usado para preencher uma função de seleção / inserção de imagem.
Embora cada elemento da página seja independente, não queremos realmente buscar a imagem json individualmente. Seria muito melhor se pudéssemos armazená-lo em cache na página.
Eu construí este pequeno wrapper jQuery ajax que armazena em cache os dados na página para que a primeira chamada faça a solicitação e salve a promessa. As chamadas subsequentes apenas obtêm a promessa de volta (de $.ajax
), permitindo que vários selecionadores de imagem obtenham seus dados com apenas 1 chamada ajax.
Basicamente, em vez de armazenar os dados em cache, armazenamos a promessa em cache.
window.CachedDataService = {
inProgress: {
},
ajax: function(ajaxOptions) {
var key = ajaxOptions.url + (JSON.stringify(ajaxOptions.data || ''))
if (this.inProgress[key]) {
return this.inProgress[key];
}
else {
this.inProgress[key] = $.ajax(ajaxOptions);
return this.inProgress[key];
}
}
}
/** sample call */
var ajaxOpts = {
url: '/big_data_fetch'
}
var success = function(data) {
// do something with the data
}
var complete = function() {
// do something after the fetch is finished
}
/*
Try the following and watch your browser network tab.
You should only see 1 XHR call.
*/
CachedDataService.ajax(ajaxOpts).done(success).always(complete)
CachedDataService.ajax(ajaxOpts).done(success).always(complete)