2015-02-21 10 views
9

Sto provando a scrivere un'app PhoneGap/Cordova.PhoneGap e WebWorkers

Sto provando a eseguire alcuni dei lavori di background più lunghi in Web Workers. Tuttavia, sto riscontrando che alcune funzionalità non sono disponibili all'interno dei Web Worker.

navigator.connection è disponibile all'interno dello script principale ma non è definito all'interno del web worker, lo stesso vale per navigator.geolocation.

Vorrei anche accedere a un database sql-lite anche da un web worker.

Qualche idea su come eseguire operazioni in background come questa all'interno di PhoneGap/Cordova?

Qualsiasi aiuto chiunque possa dare sarebbe fantastico.

risposta

15

In primo luogo è necessario comprendere che il lavoratore è un nuovo thread o un processo, e questo non include la finestra e documenti oggetti.

Cordova crea un'interfaccia tra la webview e l'API nativa. Se si esegue un worker, non si ha accesso a questa interfaccia API, quindi non è possibile utilizzare plugin o core cordova.

ho cercato di importare lo script cordova.js in un operaio:

loadScript('../cordova.js'); 

Ma getta un errore quando non trova la finestra di oggetto. Infine, emulando gli oggetti:

self.window = this; 
self.window.document = this; 
loadScript('../cordova.js'); 

La sceneggiatura del Cordova getta "ReferenceError: promp non è definito".

D'altra parte, è necessario comprendere, la comunicazione tra WebView e il codice nativo, sono asincroni. Se si invia una query SQLite ad esempio, il codice JavaScript continua a essere eseguito, quando la query viene risolta, l'API invia un evento a WebView e si esegue la richiamata.

Io uso i lavoratori ad esempio per crittografare i dati, perché questo processo è troppo difficile e causa il blocco. Ma se hai bisogno di usare i plugin Cordova, non avrai questo problema.

C'è una spiegazione to understand this.

Per SQLite, si consiglia di utilizzare Cordova-SQLitePlugin.

Se è necessario il proprio hight-processo, è possibile conoscere come fare i plugin: https://cordova.apache.org/docs/en/4.0.0/guide_hybrid_plugins_index.md.html

Nel frattempo, è possibile utilizzare i lavoratori e per inviare e ricevuto i dati, ma non con risorse riferimenti. E si noti che usando apis (come SQLite), questo sarà asincrono e non è necessario aprire un altro processo per eseguirli. Puoi semplicemente inviare il risultato a un lavoratore e lavorarlo da lì.

+0

Grazie per una risposta ben ponderata con riferimenti. Il tuo inglese non è male ... soprattutto considerando che stiamo usando termini complessi per un argomento specifico. La grazia è tua! – Neaox

1

Immaginerei che potresti passare quelli al lavoratore con un messaggio. Qualcosa come suggerito qui:

javascript web workers - how do I pass arguments?

Per quanto riguarda lo sql-lite db si dovrebbe essere in grado di inizializzare una lib collegamento all'interno di uno script operaio più o meno allo stesso modo si farebbe lo script principale.

Mi rendo conto che la risposta non può essere di taglie degno, ma può iniziare nella giusta direzione

+0

Ciao, grazie per il suggerimento, questo non funzionerà per lo scopo di cui ho bisogno in quanto questo passerà i valori nel loro stato attuale. Se passato a WebWorker, navigator.connection non cambierà nel worker quando cambia nel thread principale. Non l'ho provato con l'oggetto SQLlite ma ho il sospetto che ci saranno dei problemi con il passaggio di questo, anch'io ci provo e torno da te. Grazie ancora per il suggerimento. – Neaox

+0

@Neaox "Se passato al WebWorker il navigator.connection non cambierà nel worker quando cambia nel thread principale" Questo è vero: non ci sono oggetti condivisi AFAIK tra il worker e il thread principale. Tutto deve essere comunicato da messaggi espliciti. –

1

A causa del fatto che i Web Worker sono eseguiti all'esterno del thread principale dell'applicazione, non hanno lo stesso accesso alle funzionalità JavaScript come fa l'applicazione principale. I suoi lavoratori non hanno accesso a:

  • Il DOM
  • Il documento oggetto oggetto
  • La finestra
  • L'oggetto padre

Se si desidera che l'applicazione nel thread UI per comunicare con un lavoratore è necessario passare l'oggetto attraverso il messaggio. Ma poiché il lavoratore accetta string, è possibile utilizzare JSON.parse() o JSON.stringify() per inviare correttamente l'oggetto.