pagina mostrar mientras funcion force ejecutar despues cargar carga cache asincrona antes javascript caching angularjs

mostrar - javascript clear cache browser



Problema de caché de IE angular para $ http (17)

En lugar de deshabilitar el almacenamiento en caché para cada solicitud GET, lo deshabilito globalmente en el $ httpProvider:

myModule.config([''$httpProvider'', function($httpProvider) { //initialize get if not there if (!$httpProvider.defaults.headers.get) { $httpProvider.defaults.headers.get = {}; } // Answer edited to include suggestions from comments // because previous version of code introduced browser-related errors //disable IE ajax request caching $httpProvider.defaults.headers.get[''If-Modified-Since''] = ''Mon, 26 Jul 1997 05:00:00 GMT''; // extra $httpProvider.defaults.headers.get[''Cache-Control''] = ''no-cache''; $httpProvider.defaults.headers.get[''Pragma''] = ''no-cache''; }]);

Todas las llamadas ajax que se envían desde el IE se almacenan en caché por Angular y recibo una 304 response para todas las llamadas posteriores. Aunque la solicitud es la misma, la respuesta no será la misma en mi caso. Quiero desactivar este caché. Intenté agregar el cache attribute a $ http.get pero todavía no ayudó. ¿Cómo se puede resolver este problema?


Esta única línea me ayudó (Angular 1.4.8):

$httpProvider.defaults.headers.common[''Pragma''] = ''no-cache'';

UPD: El problema es que IE11 hace caché agresivo. Cuando estaba buscando en Fiddler, noté que en el modo F12 las solicitudes envían "Pragma = no-cache" y se solicita el punto final cada vez que visito una página. Pero en el modo normal, el punto final solo se solicitó una vez la primera vez que visité la página.


Este problema se debe al problema de almacenamiento en caché de IE como dijiste, puedes probarlo en el modo de depuración de IE presionando f12 (esto funcionará bien en el modo de depuración) .IE no tomará los datos del servidor cada vez que la página realice una llamada. Los datos de la caché. Para deshabilitar esto, realice una de las siguientes acciones:

  1. adjunte lo siguiente con su url de solicitud de servicio http

// Antes (emitido uno)

this.httpService.get (this.serviceUrl + "/eAMobileService.svc/ValidateEngagmentName/" + engagementName, {})

// Después (trabajando bien)

this.httpService.get (this.serviceUrl + "/eAMobileService.svc/ValidateEngagmentName/" + engagementName + "? DateTime =" + new Date (). getTime () + '''', {cache: false})

  1. Deshabilita el caché para todo el módulo: -

$ httpProvider.defaults.headers.common [''Pragma''] = ''no-cache'';


Esto es un poco viejo, pero: Soluciones como obsoletas. Deje que el servidor maneje el caché o no el caché (en la respuesta). La única forma de garantizar que no haya almacenamiento en caché (pensando en las nuevas versiones en producción) es cambiar el archivo js o css con un número de versión. Lo hago con webpack.



Intenta esto, funcionó para mí en un caso similar:

$http.get("your api url", { headers: { ''If-Modified-Since'': ''0'', "Pragma": "no-cache", "Expires": -1, "Cache-Control": "no-cache, no-store, must-revalidate" } })


La garantía de que tenía trabajo era algo así:

myModule.config([''$httpProvider'', function($httpProvider) { if (!$httpProvider.defaults.headers.common) { $httpProvider.defaults.headers.common = {}; } $httpProvider.defaults.headers.common["Cache-Control"] = "no-cache"; $httpProvider.defaults.headers.common.Pragma = "no-cache"; $httpProvider.defaults.headers.common["If-Modified-Since"] = "Mon, 26 Jul 1997 05:00:00 GMT"; }]);

Tuve que combinar 2 de las soluciones anteriores para garantizar el uso correcto de todos los métodos, pero puede reemplazar common método common por get u otro método, es decir, post , delete para que esto funcione en diferentes casos.


La solución anterior funcionará (haga que la URL sea única agregando en la cadena de consulta un nuevo parámetro) pero prefiero la solución propuesta [aquí]: ¿Es una mejor manera de evitar el caché de IE en AngularJS? , que manejan esto a nivel de servidor ya que no es específico de IE. Quiero decir, si ese recurso no se debe almacenar en caché, hágalo en el servidor (esto no tiene nada que ver con el navegador utilizado; es intrínseco al recurso).

Por ejemplo, en java con JAX-RS, hágalo de manera programatically para JAX-RS v1 o declativly para JAX-RS v2.

Estoy seguro de que alguien descubrirá cómo hacerlo.


Lo resuelvo agregando datetime como un número aleatorio:

$http.get("/your_url?rnd="+new Date().getTime()).success(function(data, status, headers, config) { console.log(''your get response is new!!!''); });


Para Angular 2 y RequestOptions más recientes , la forma más sencilla de agregar los encabezados mencionados es anular la clase RequestOptions utilizada por el servicio Http :

import { Injectable } from ''@angular/core''; import { BaseRequestOptions, Headers } from ''@angular/http''; @Injectable() export class CustomRequestOptions extends BaseRequestOptions { headers = new Headers({ ''Cache-Control'': ''no-cache'', ''Pragma'': ''no-cache'', ''Expires'': ''Sat, 01 Jan 2000 00:00:00 GMT'' }); }

Y hazlo referencia en tu módulo:

@NgModule({ ... providers: [ ... { provide: RequestOptions, useClass: CustomRequestOptions } ] })


Para evitar el almacenamiento en caché, una opción es proporcionar una URL diferente para el mismo recurso o datos. Para generar una URL diferente, puede agregar una cadena de consulta aleatoria al final de la URL. Esta técnica funciona para solicitudes ajax tipo JQuery, Angular u otro tipo.

myURL = myURL +"?random="+new Date().getTime();


Puede agregar una cadena de consulta única (creo que esto es lo que hace jQuery con la opción caché: falsa) a la solicitud.

$http({ url: ''...'', params: { ''foobar'': new Date().getTime() } })

Una solución quizás mejor es que si tiene acceso al servidor, entonces puede asegurarse de que los encabezados necesarios estén configurados para evitar el almacenamiento en caché. Si está utilizando ASP.NET MVC esta respuesta podría ayudar.


Simplemente agregué tres etiquetas meta en index.html en el proyecto angular, y el problema del caché se resolvió en IE.

<meta http-equiv="Pragma" content="no-cache"> <meta http-equiv="Cache-Control" content="no-cache"> <meta http-equiv="Expires" content="Sat, 01 Dec 2001 00:00:00 GMT">


También puedes intentar en tu servidor configurar encabezados como por ejemplo:

... import { Injectable } from "@angular/core"; import { HttpClient, HttpHeaders, HttpParams } from "@angular/common/http"; ... @Injectable() export class MyService { private headers: HttpHeaders; constructor(private http: HttpClient..) { this.headers = new HttpHeaders() .append("Content-Type", "application/json") .append("Accept", "application/json") .append("LanguageCulture", this.headersLanguage) .append("Cache-Control", "no-cache") .append("Pragma", "no-cache") } } ....


usted puede agregar un interceptor.

myModule.config([''$httpProvider'', function($httpProvider) { $httpProvider.interceptors.push(''noCacheInterceptor''); }]).factory(''noCacheInterceptor'', function () { return { request: function (config) { console.log(config.method); console.log(config.url); if(config.method==''GET''){ var separator = config.url.indexOf(''?'') === -1 ? ''?'' : ''&''; config.url = config.url+separator+''noCache='' + new Date().getTime(); } console.log(config.method); console.log(config.url); return config; } }; });

debe eliminar las líneas de console.log después de verificar.


Siempre use un enfoque simple, agregue la marca de tiempo con cada solicitud sin necesidad de borrar el caché

let c=new Date().getTime(); $http.get(''url?d=''+c)


meta http-equiv="Cache-Control" content="no-cache"

Acabo de agregar esto a View y comenzó a trabajar en IE. Confirmado para trabajar en Angular 2.