2010-08-06 17 views
5

Ho bisogno di comunicazione inter-componente in un'applicazione web e sto prendendo in considerazione diversi modi per farlo. Ho alcune idee, ma vorrei dare il benvenuto ad altre idee.Comunicazione inter-componente in javascript

In primo luogo, un esempio semplice e veloce. Ho due componenti separati su una pagina che vengono caricati in modo asincrono. Per componente, intendo una porzione di codice HTML a cui è associato un oggetto javascript che include comportamenti basati su jQuery sui nodi nell'html. Quando un utente interagisce con un componente, le modifiche devono aver luogo nell'altro componente e viceversa.

La cosa fondamentale da ricordare qui è che ogni componente deve essere un'unità autonoma. Potrebbe essere riutilizzato in diverse parti di un'applicazione o anche in applicazioni diverse. Quindi non sa dell'esistenza degli altri componenti nella pagina.

Le mie attuali riflessioni su una soluzione implicano l'ascolto di componenti per gli eventi personalizzati a cui sono interessati nonché l'invio di eventi personalizzati quando un'azione è stata eseguita. Pertanto, ogni componente ascolta gli eventi che sono attivati ​​dall'altro.

Il problema è che a causa del caricamento asincrono, un componente potrebbe impiegare più tempo a caricarsi rispetto all'altro. Esiste la possibilità che un evento venga inviato troppo presto e venga perso. In alcune situazioni questo potrebbe andar bene, ma in alcuni casi ho bisogno di assicurarmi che tutti gli eventi inviati da un componente vengano consumati.

Quindi, ecco alcune domande correlate:

  1. Cosa succede a un evento dopo che è stato attivato? Scompare se non ci sono ascoltatori al momento in cui è stato attivato?

  2. C'è un modo per rilevare se un triggerato è stato consumato o perso?

  3. Quali sono alcuni buoni modi per ciascun componente per conoscere gli altri componenti?

  4. Esistono progetti javascript open source o plug-in jQuery che gestiscono questo tipo di cose?

Riguardo alla domanda 3 #, sto pensando che ogni componente potrebbe inviare una sorta di registro evento che include i tipi di eventi che ascolta e un elenco dei componenti che ha registrato con. I componenti dovrebbero ascoltare questi eventi registrati. Verrebbe utilizzata una sorta di logica di registrazione che utilizza i timer per assicurarsi che i componenti giusti vengano registrati insieme durante il processo di caricamento dei componenti. Una volta completata la registrazione, i componenti saranno in grado di inviare i loro eventi normali.

risposta

1

I servizi Web sono un buon modello per fare riferimento qui. Quando si dispone di servizi Web interconnessi che vengono utilizzati per il cloud computing (o qualsiasi piattaforma di calcolo distribuito) di solito implementano una sorta di coda di messaggi o "bus" tra di loro.

Si potrebbe pensare di creare una coda di messaggi globale che gestisca gli "eventi" e può pubblicarli agli abbonati o trattenerli fino a quando non viene intrapresa un'azione (solitamente chiamata job).

+1

Questa è una buona idea. Il bus messaggi potrebbe essere a livello di applicazione e avviato al caricamento della pagina. Quindi i componenti inviano semplicemente gli eventi, il bus li intercetta e li spinge agli abbonati appropriati o li tiene fino a quando un utente non si registra. Se il time-to-live di un evento scade, potrebbe anche notificare al componente di invio originale che l'evento è fallito. – Tauren

1

Non sono sicuro se questo incapsula completamente ciò che stai cercando di fare, ma sembra un progetto open source come JavaScriptMVC potrebbe esserti utile.Questo framework open source consente ai controller di gestire la delega degli eventi e fornisce parte della separazione che stai cercando. Sfrutta anche jQuery sotto il cofano.

Il sito è un po 'difficile da navigare (o almeno trovare un sacco di informazioni concrete) ma il video introduttivo è utile (12 minuti di lunghezza).

Spero che questo aiuti! In bocca al lupo!

+0

Grazie! Ho già cercato JavascriptMVC, ma non l'ho ancora usato. Non sono sicuro che sia lo strumento giusto per il lavoro poiché gran parte di ciò che fa è già gestito diversamente nella mia applicazione. Ma esaminerò di più riguardo alla gestione degli eventi. Speravo di trovare qualcosa di un po 'più leggero con una curva di apprendimento più piccola. – Tauren

4

L'accodamento dei messaggi è davvero ciò che sembra cercare. Sono sicuro che puoi immaginare vari schemi che coinvolgono un oggetto osservatore in ascolto di eventi personalizzati, ricevere messaggi, giocare con tempi e sequenze, limitarsi, trasmettere, ecc. Ma prima di entrare in questo, dai un'occhiata a questo jQuery message queuing plug-in. Potrebbe essere un buon punto di partenza.

+0

Molto bello! Ho esplorato i plug-in di Ben Alman in passato, ma non dovevo averne bisogno in quel momento e me ne sono dimenticato. Grazie per averlo fatto notare, potrebbe essere perfetto. – Tauren

1

Qualcos'altro da considerare attorno alla gestione degli eventi sono i Reactive Extensions for JavaScript di Microsoft (RxJS). È lungo lo stesso tipo di linee del controller in JavaScriptMVC in cui si registrano gli eventi in sequenze osservabili, ma in tal caso è possibile interagire con loro in sintassi simile a LINQ.

Matthew Podwysocki ha un numero di post di blog validi su come lavorare con RxJS. Ecco alcuni buoni messaggi:

Introduction to RxJS (buona introduzione)
Error Handling Pt. 2 con i link ai suoi molti altri posti

e un link ad alcuni hands on labs per RxJS.

Speriamo che questo aiuti anche!