2010-01-13 9 views
5

Bene, prima voglio dire che sono un po 'nuovo nel mondo di Internet Dev.javascript parallelism

In ogni caso, sto cercando di sapere se è possibile eseguire due pezzi di codice in parallelo usando javascript.

Quello che mi serve veramente è chiamare due metodi che si trovano in un server remoto. Passo, per entrambi, una funzione di callback che verrà eseguita presto i dati che voglio sia pronto. Poiché il server che esegue queste funzioni richiede un po 'di tempo per rispondere, sto cercando di trovare un modo per chiamare entrambi i metodi allo stesso tempo senza dover attendere che il primo termini di chiamare il secondo.

Does metodi come setTimeout eseguiti simultaneamente, ad esempio

setTimeout(func1, 0); 
setTimeout(func2, 0); 

...

function func1() 
{ 
    webMethod1(function() {alert("function 1 returned"); }); 
} 

function func1() 
{ 
    webMethod2(function() {alert("function 2 returned"); }); 
} 

A cura

Ho appena trovato questo articolo che può essere molto fresco per la fine dei prossimi browser: Javascript web workers

+0

Non so se la funzione di timeout viene chiamata mentre è in esecuzione un altro codice. Potresti testarlo facilmente. –

+0

Sì, il problema è che nel mio codice originale ci sono molte dipendenze che devo controllare prima di cambiarlo per implementarlo in quel modo e voglio fare tutto ciò che funziona solo se vale la pena. – Andres

risposta

7

C'è una singola discussione di esecuzione in Javascript nei normali browser Web: i gestori del timer verranno chiamati in serie. Il tuo approccio utilizzando i timer funzionerà nel caso in cui presenti.

C'è un nice piece of documentation on timers da John Resig (autore del molto popolare jQuery framework javascript - se siete nuovi per lo sviluppo Web, vi suggerisco di guardare in su).

Ora, se si fa riferimento ai browser basati su HTML5, a un certo punto, dovrebbero avere il supporto per il threading.

+0

+1. anche se è vero che verranno chiamati in serie, aggiungerei che l'uso di OP di 'webMethod' implica che quello che * veramente * vuole evitare è in attesa sincrona di due richieste web diverse, e che può essere evitato tramite AJAX. –

+0

@David: potremmo notare che nel Browser ci possono essere in genere almeno 2 connessioni al server di origine attive in parallelo, rendendo le chiamate AJAX efficacemente un buon veicolo per la parallelizzazione. – jldupont

+0

Ottimo articolo .. – Andres

-2

Dipende dal motore JavaScript.

+0

No. JavaScript è thread singolo in tutti i browser e l'OP chiedeva JavaScript nei browser. –

2

Sì, è esattamente come funzionano le richieste Web tramite AJAX. Non è necessario aggiungere setTimeout a 0, è sufficiente chiamarli uno per uno e creare una richiesta AJAX, che verrà eseguita in modo asincrono, consentendo di passare una funzione di callback da richiamare al termine della richiesta.

Le modalità di creazione di una richiesta AJAX variano in base al browser utilizzato. Se hai intenzione di creare qualcosa che dipende in larga misura da AJAX e vuoi che funzioni su più browser, sei meglio con una libreria. Ecco come si fa in jQuery, per esempio:

$.ajax({ url: '/webrequesturl', success: function(result) { 
    // this will be called upon a successful request 
} }); 
$.ajax({ url: '/webrequest2url', success: function(result) { 
    // this will be called upon a successful request 
    // this may or may not be called before the above one, depending on how long it takes for the requests to finish. 
} }); 
2

Beh, JavaScript è a thread singolo, i due timer verrà eseguito in sequenza uno dopo l'altro, anche se non si nota di esso.

ti consiglierei di dare un'occhiata al seguente articolo, si spiega veramente come i timer e gli eventi asincroni lavoro, vi aiuterà anche a comprendere la natura single-threaded di JavaScript:

E in alternativa è possibile dare un'occhiata a WebWorkers, è un modo per eseguire script in thread in background separati, ma sono supportati solo dai browser moderni.

0

Quello che stai cercando è asincrono comunicazione client-server (parola chiave: async). Le funzioni asincrone vengono restituite immediatamente, ma il callback fornito verrà eseguito dopo che la condizione specificata è soddisfatta.

Quindi, se la funzione che invia una richiesta al server è asincrona, ciò consentirebbe di inviare entrambe le richieste al server senza attendere che uno risponda.

L'utilizzo di setTimeout può funzionare, in quanto pianificherà l'esecuzione di entrambe le funzioni di invio della richiesta. Tuttavia, alcuni browser eseguono solo un thread di Javascript alla volta, quindi il risultato sarebbe che una delle funzioni pianificate funzionasse e bloccherebbe (in attesa di una risposta) e l'altra funzione programmata aspetterebbe che il primo sia stato eseguito per iniziare a girare .

Si consiglia di utilizzare il supporto asincrono dalla libreria di comunicazione del server. Ad esempio, jQuery utilizza async per impostazione predefinita.