Ho alcune chiamate che devono essere eseguite in sequenza. Prendi in considerazione un IService con metodo Query e Load. La query fornisce un elenco di widget e il carico fornisce un widget "predefinito". Quindi, il mio servizio è simile a questo.Come organizzo queste chiamate usando Reactive Extensions (Rx) in Silverlight?
void IService.Query(Action<IEnumerable<Widget>,Exception> callback);
void IService.Load(Action<Widget,Exception> callback);
Con questo in mente, ecco un abbozzo del modello di visualizzazione:
public class ViewModel : BaseViewModel
{
public ViewModel()
{
Widgets = new ObservableCollection<Widget>();
WidgetService.Query((widgets,exception) =>
{
if (exception != null)
{
throw exception;
}
Widgets.Clear();
foreach(var widget in widgets)
{
Widgets.Add(widget);
}
WidgetService.Load((defaultWidget,ex) =>
{
if (ex != null)
{
throw ex;
}
if (defaultWidget != null)
{
CurrentWidget = defaultWidget;
}
}
});
}
public IService WidgetService { get; set; } // assume this is wired up
public ObservableCollection<Widget> Widgets { get; private set; }
private Widget _currentWidget;
public Widget CurrentWidget
{
get { return _currentWidget; }
set
{
_currentWidget = value;
RaisePropertyChanged(()=>CurrentWidget);
}
}
}
Quello che mi piacerebbe fare è semplificare il flusso di lavoro sequenziale di chiamare query e quindi il valore di default. Forse il modo migliore per farlo è annidato con espressioni lambda come ho mostrato, ma ho pensato che potrebbe esserci un modo più elegante con Rx. Non voglio usare Rx per motivi di Rx, ma se mi può permettere di organizzare la logica sopra, quindi è più facile leggere/mantenere nel metodo, ne approfitterò. Idealmente, qualcosa come:
Observable.Create(
()=>firstAction(),
()=>secondAction())
.Subscribe(action=>action(),error=>{ throw error; });
Con la biblioteca di potenza threading, mi piacerebbe fare qualcosa di simile:
Service.Query(list=>{result=list};
yield return 1;
ProcessList(result);
Service.Query(widget=>{defaultWidget=widget};
yield return 1;
CurrentWidget = defaultWidget;
che lo rende molto più evidente che il flusso di lavoro è sequenziale ed elimina nidificazione (le rese sono parte dell'enumeratore asincrono e sono limiti che bloccano fino a quando i risultati non tornano).
Qualsiasi cosa simile avrebbe senso per me.
Quindi l'essenza della domanda: sto tentando di inserire un piolo quadrato in un buco rotondo, o c'è un modo per ridefinire le chiamate asincrone annidate usando Rx?
ero alla ricerca di qualcosa di simile per questa domanda: http://stackoverflow.com/questions/3280345/is-there-a -useful-design-pattern-for-chained-asincrona-event-calls-se sei in grado di rispondere alla mia domanda con te sei esperienza sarebbe apprezzato =) –
Sto lavorando sulla prova di concetto per mostrare aggregazione multipla (diverse) chiamate di servizio e eseguendole in sequenza. Ti farò sapere quando è pronto! –