2015-06-30 13 views
14

Abbiamo un'applicazione Web che funziona correttamente da più di un anno su gran parte dei browser. Recentemente abbiamo scoperto che non funziona così bene su Safari.Impossibile caricare la risorsa: richiesta scaduta su Safari

Un sacco di azioni si concludono con il seguente errore: Failed to load resource: Request timed out. La cosa divertente è che l'azione viene effettivamente eseguita correttamente (per la maggior parte del tempo).

Quando si esamina l'errore, sembra che si verifichi quando è richiesta una richiesta ajax.

Per prima cosa ho cercato di cambiare l'impostazione del timeout ajax effettuando le seguenti operazioni:

$.ajax({ 
     "type"  : methode, 
     "dataType" : "json", 
     "url"  : url, 
     "async"  : async, 
     "data"  : donneesEnvoyees, 
     "timeout" : 60000 
}) 

che non cambia nulla, l'errore è in realtà mostrando dopo circa 10 secondi, che è inferiore al timeout definito .

Dopo aver letto un po 'su internet, ho visto alcune risposte sulla specifica no-cache in modo che Safari non mantenga i parametri del post nella cache. Non posso dire Capisco perfettamente che, ma ho ancora provato seguente modo:

$.ajax({ 
    "type"  : methode, 
    "headers" : { "cache-control": "no-cache" }, <-- added this line 
    "dataType" : "json", 
    "url"  : url, 
    "async"  : async, 
    "data"  : donneesEnvoyees, 
    "timeout" : 60000 
}) 

Come si può intuire, ho ancora lo stesso errore.

Avete qualche idea di cosa sta succedendo? Perché questo errore si verifica solo su Safari e non su altri browser? Come sistemarlo?

+0

Qual è il valore delle variabili js 'methode', 'url', 'async', 'donneesEnvoyees'? dove stai chiamando ajax? Qualunque sia stata la regex? Il metodo –

+0

è POST o GET. url è l'azione, async è per lo più "falso" in tutte le richieste e "donneesEnvoyees" sono i parametri del post. Sto chiamando Ajax a presentare, e nessuna regex ha coinvolto no. – realUser404

+0

la tua ajax ha una funzione 'error()'? se è così puoi includerlo nella domanda? –

risposta

4

Imposta il async: true sulle impostazioni di ajax. Farà in modo che il browser tenga la connessione e si chiuda dopo aver ricevuto la risposta.

+0

Che funzionerebbe con richieste che possono essere asincrone, ma a volte non è possibile. Ad ogni modo, perché il safari reagisce in quel modo con richieste sincrone? – realUser404

+1

Dalla mia esperienza e ricerca, Safari sovrascrive il timeout fornito su impostazioni ajax da solo, usando 10 secondi. – douglasf89

+0

Assegnandoti la taglia in quanto la tua risposta aiuta alcune richieste (non tutte). Ancora non capisco cosa sta succedendo e come risolverlo per davvero (anche con richieste sincrone). – realUser404

0

penso che il problema verrà risolto se si rimuove dataType : "json" dal codice se il ritorno dalla pagina Ajax non è una vera e propria JSON stringa di. Ho notato che il $.ajax() non va alla funzione di successo se è fornito il dataType : "json" ei dati di ritorno non sono del tipo JSON.

PS
Ci sono alcune cose come le impostazioni di AJAX parole chiave type, dataType, url ecc non dovrebbero essere tra virgolette. Anche se il codice funzionerà anche con il modo attuale, ma il modo corretto è quello che ho menzionato.

$.ajax({ 
     type  : methode, 
     dataType : "json", 
     url  : url, 
     async  : async, 
     data  : donneesEnvoyees, 
     timeout : 60000, 
     success : function(data){ 
       alert('success'); 
     } 
}); 

Presumo è stata aggiunta una funzione di success con questa chiamata AJAX, che è possibile utilizzare per utilizzare diverse azioni in base al risultato.

+1

Il ritorno è sempre una stringa JSON corretta, quindi non penso che questo sia il problema. Per quanto riguarda la tua presunzione, non ho una funzione 'successo()' ma una funzione 'fatta()' – realUser404

1

Ho ricevuto lo stesso problema.Risolto con l'aggiunta di un'intestazione CORS e codice di stato un problema con la

res.header('Access-Control-Allow-Origin', '*'); 
res.status(200); 

Come & Perché

Dopo aver scavato nell'errore leggendo il codice sorgente di jQuery, ho capito che il vero problema è la XMLHttpRequest in jQuery + Safari chiama onError con un codice di stato http 0. Così ho aggiunto le intestazioni CORS e gli ho dato un codice di stato 200 per risolvere il problema.