Come lavori con le funzioni asincrone, in modo ricorsivo?

4

Attualmente sto lavorando su FLEX e devo chiamare un servizio web. una volta ottenuto il risultato, devo chiamare di nuovo il servizio web, con il risultato precedente come input.

Un problema di capitalizzazione è che il servizio potrebbe restituire più risultati e devo chiamare di nuovo il servizio con ciascuno dei risultati come input. Infine, ho bisogno che i risultati siano in una collezione di array gerarchici, con ogni risultato come figlio dell'input al servizio web.

Se fosse una funzione sincrona, sarebbe stato molto semplice, ma ho passato mezza giornata a cercare di creare qualcosa di elegante per il servizio web.

Ho finito con due array, uno per l'input e uno per i risultati. Ogni volta che ho avuto uno o più risultati, l'ho inserito nell'array di input e nei risultati. Vorrei quindi rimuovere il primo elemento dall'array di input e chiamare il servizio Web con esso, e così via, fino a quando ho finito tutti gli input. Una volta ottenuti tutti i risultati, ho creato una funzione ricorsiva che avrebbe creato l'albero gerarchico, di cui avevo bisogno.

Questa sembra una soluzione WTF molto hacky. C'è una soluzione elegante e migliore? Sono tutto orecchie.

    
posta Devdatta Tengshe 20.10.2011 - 16:43
fonte

2 risposte

2

Forse potresti implementare una sorta di "albero di caricamento automatico".

Inizia con il primo nodo. Questo nodo recupera i dati dal server. Per ogni elemento trovato nella risposta, crea un nodo figlio che caricherà i dati appropriati. E così via ...

Una cosa che devi sapere è "Quando è completa?"

Questo può essere gestito con eventi. Ogni nodo invia un evento quando tutti i suoi figli sono completi. In modo ricorsivo questo finirà per dire alla radice che tutti i bambini sono completi. Il nodo radice attiverà l'evento "I'm complete" per dire a chi vuole saperlo, che l'albero è completo.

Tuttavia, mi chiedo: perché non si crea un servizio sul server che restituisce l'intero albero?

    
risposta data 20.10.2011 - 17:38
fonte
1

Ho anche una serie di servizi basati sul web che devono essere chiamati in ordine. Ho risolto il problema con AJAX. La chiave sta avendo un meccanismo di callback per eseguire la ricorsione, forzando la sincronizzazione.

Qualcosa di simile a questo ( jQuery )

function Recurse(params)
{
$.get(url,
            {params},
            function (data) {Recurse(data)}//callback does recursive call, also passes in variable data received from the web service
            ,'html');
}

Dovresti controllare l'API in questione per vedere se si tratta di una struttura dati ad albero come il DOM . Di solito la ricorsione è un buon approccio per iterare gli alberi. Se si tratta di un'API lineare e piatta, è possibile utilizzare una coda / pila per eseguire il push / pop dell'API in modo ricorsivo.

Ecco come iterare ricorsivamente il DOM. Il codice per un'altra struttura API basata su albero sarà simile (javascript)

function walk(node, func) {
   //walk the height of the tree
   func(node);//do something to the node
   node = node.firstChild;
   while(node) {
      //walk siblings
      walk(node, func);
      node = node.nextSibling;
   }
}
    
risposta data 20.10.2011 - 17:09
fonte

Leggi altre domande sui tag