2011-10-21 3 views
6
  1. Non sto facendo un grosso pezzo di calcolo in JS.
  2. Tutto funziona bene su iPad iOS 5 in Safari fino a quando ho aggiunto questo codice:L'esecuzione di JavaScript ha superato il timeout

    var watchID = navigator.geolocation.watchPosition(updatePos,locationError,{maximumAge: 10000, frequency: 60000, enableHighAccuracy: true, timeout: 1000}); 
    
    function updatePos(position) {  
        if (position.coords.accuracy < accuracyThreshold) {     
         $.post(websiteRoot + '/ReportDeviceLocation?rand=' + (Math.random() * Math.random()) + '&longitude=' + position.coords.longitude + '&latitude=' +position.coords.latitude); 
    
        } else { 
         console.debug("Location data is not accurate enough. Location not updated."); 
        } 
    } 
    
  3. Poi la pagina web ha lavorato per circa 4 minuti e ottengo questo errore: l'esecuzione

    JavaScript superato tempo scaduto.

  4. Quindi non caricare JavaScript. Nessuno dei messaggi di debug che ho inserito nel file my.js verrebbe stampato. Solo l'errore sopra.

  5. L'errore persiste anche dopo aver lasciato la pagina che ha generato questo errore e aperto altre pagine Web con lo stesso dominio.

  6. Ho provato try e catch, ho utilizzato la funzione setTimeout, ma nessuno dei due mi ha fornito la fonte dell'errore né risolto il problema.

Non so quale sia il problema. Mi sta bruciando per tutto il giorno e mi brucierà per il fine settimana.

+0

Ho lo stesso problema con siti diversi. Uccidere tutte le app e riavviare Safari "risolve" il problema per me. Quindi sembra un bug in iOS5. – user123444555621

+0

Ho trovato questa pagina che in un modo spiega il mio problema, ma non elabora come risolverlo: http://www.sensiblesoftware.com/weblog/2011/07/06/iphone-javascript-execution-exceeded-timeout/ – YoYoMyo

+0

Vedere anche http://stackoverflow.com/questions/7787219/javascript-ios5-javascript-execution-exceeded-timeout che descrive lo stesso sintomo (ma potrebbe essere causato da un problema leggermente diverso) – user123444555621

risposta

6

Sorprendentemente, quando ho utilizzato geolocation.getCurrentPosition, il messaggio di errore ha smesso di essere visualizzato. Per sostituire watchPosition con getCurrentPosition, a utilizzare la funzione setInterval:

 function getLocation() { 
      navigator.geolocation.getCurrentPosition(updatePos, locationError, { enableHighAccuracy: true, timeout: 10000 }); 
     } 

     var intervalID = window.setInterval(getLocation, 10000); 

Questo ha funzionato meglio watchPosition perché watchPosition volte non segue regole (percorso di aggiornamento 8 volte in 3 minuti, nonostante la frequenza è impostata a 10 minuti).

Se si verifica ancora il timeout, uno avrebbe bisogno di chiamare clearInterval:

var geolocationID; 
(function getLocation() { 
    var count = 0; 
    geolocationID = window.setInterval(
     function() { 
      count++; 
      if (count > 3) { //when count reaches a number, reset interval 
       window.clearInterval(geolocationID); 
       getLocation(); 
      } else { 
       navigator.geolocation.getCurrentPosition(updatePos, locationError, { enableHighAccuracy: true, timeout: 10000 }); 
      } 
     }, 
     600000); //end setInterval; 
})(); 
+0

Ho sostituito WatchPosition con GetCurrentPosition e risolto questo problema di timeout e non abbiamo avuto alcun problema ora. Sembra che l'implementazione di WatchPosition abbia qualche problema in iOS5. Ho verificato anche questo facendo lo stesso con maps.google.com. Prima ero in grado di riprodurre la stessa eccezione di timeout JavaScript seguendo pochissimi passaggi e riprodurre l'eccezione ogni volta. Ora ho rifiutato google maps per ottenere la mia posizione attuale e ora le mappe funzionano bene anche con gli stessi identici passaggi che seguo per generare questa eccezione di timeout. Grazie per la soluzione. – Chandramuralis

0

Forse è il problema di Safari che blocca tutto getCurrentPosition durante l'esecuzione watchPosition in un'altra scheda o sito web.

0

Ho avuto un problema simile e utilizzo anche la geolocalizzazione html5.

Ho già implementato la soluzione setInterval() suggerita. Lo stesso problema si è verificato, anche se richiede molto più tempo.

ho fatto alcuni esperimenti mettendo il seguente frammento nel mio codice, solo per 'pausa' l'esecuzione del codice:

ms = 30000; 
ms += new Date().getTime(); 
while (new Date() < ms){ 
} 

È possibile che questo frammento genera in modo affidabile un timeout di esecuzione di JavaScript. Ho scoperto di nascosto che anche il frammento successivo genererà un timeout. Ma sembra che il browser sia in grado di recuperare dal timeout. Non chiedermi il perché. Funziona e basta. Spero che le persone interessate possano verificare i miei risultati.

ms = 30000; 
ms += new Date().getTime(); 
while (new Date() < ms){ 
    if (new Date() %100 == 0){ 
     console.log('in while'); 
    } 
} 

Così, la soluzione sembra essere, banale possa sembrare, che console.logs dovrebbero essere aggiunti a porzioni del codice che si chiama più spesso.Spero che questo possa essere utile (anche se penso che sia ridicolo ma funziona per me)

+0

Ho provato il codice sopra in Chrome e Firefox, non ho ricevuto l'errore di timeout. – YoYoMyo

+0

Penso che un buon modo per assicurarsi che getCurrentLocation non sia scaduto è quello di reimpostare l'intervallo usando clearInterval e immediatamente dopo quella chiamata setInterval (getLocation, 10000) di nuovo. – YoYoMyo

+0

Btw, il codice è pensato per essere provato nel safari mobile. – razorsniper

2

Proprio come un addendum: Questo problema esiste anche negli iPhone (non a caso) e non è ancora stato risolto. Ancora peggio, se si esce (non uccidere) il browser, si ottiene uno scolapiatti, entro 12 ore il telefono è morto. Sfortunatamente ho bisogno di fare affidamento sull'orologio poiché getCurrentPosition è di gran lunga meno accurato.

Una volta impostato il bug (dopo ~ 4min, come riportato), viene segnalato un errore di timeout dell'esecuzione esattamente ogni secondo e il motore JS non funziona. Il problema è che NON è un timeout di esecuzione. Questo è il bug, anche i ricaricamenti del sito non lo cambiano, stop/start dell'orologio non aiuta neanche. Solo uccidere il browser (toccare due volte il pulsante, toccare l'icona, quindi -) fa il trucco.

Sembra che siamo condannati fino rilascia mela una correzione ...

Aggiornamento: dopo più la sperimentazione di questo sembra che il problema sono le richieste XHR, forse jquery specifico, sembra che ci sia un limite su quelle richieste o nessuna corretta pulizia. L'errore di timeout si aprirà su qualsiasi altro sito e non appena viene attivato il primo XHR. Prima che tutto JS funzioni correttamente.

1

Ho faticato con lo stesso problema e ho trovato una soluzione abbastanza elegante.

Gli errori di timeout si sono verificati quando ho avviato il mio 'modo di seguire la posizione' con navigator.geolocation.watchPosition e ricaricato la pagina senza interromperla. Così ho potuto risolvere questo problema semplicemente cancellando l'osservatore quando l'utente lasciava la pagina.

$(window).unload(function(){ 
    window.navigator.geolocation.clearWatch(myWatchHandler); 
}); 

Spero che questo aiuti!

1

Sto usando watchPosition per postare indietro la mia velocità latente e latente. Ho avuto lo stesso problema degli utenti in questo thread: Safari/Chrome su iOS ha ucciso il feed GPS (non era l'intervallo che si fermava, ho provato). Solo uccidendo il browser (come in doppio clic sul pulsante home) potrei farlo funzionare ancora per un paio di secondi. Ho provato di tutto, come cancellare l'intervallo ma non ha funzionato. Poi, dopo, sono uscito e ha continuato a funzionare! Sono tornato dentro e il segnale GPS era sparito. Dal momento che app come RunKeeper continuavano a funzionare all'interno, supponevo che avrebbe funzionato anche all'interno, ma risultò essere wrong. Se qualcuno ha qualche domanda, non esitate a chiedere.