Contesto variabile da un chiamante iniziale non reattivo
L'intera applicazione non può essere reattiva, cioè questo metodo deve restituire un risultato qui
public string GetTextOfInterest()
{
var searchQuery = "Single Responsibility";
var titleShouldContain = "SRP";
var uriShouldContain = "pattern";
var pageShouldContain = "arguments";
return this.NonReactive(searchQuery, titleShouldContain, uriShouldContain,pageShouldContain);
}
Implementazione del blocco non reattivo
Questa implementazione non reattiva funziona bene
private string NonReactive(string searchQuery, string titleShouldContain, string uriShouldContain, string pageShouldContain)
{
// Googler returns result directly here and does not move on before
var gooResult = this.googler.Search(searchQuery);
if (gooResult.Title.Contains(titleShouldContain) && gooResult.Uri.Contains(uriShouldContain))
{
// Blocking here again to wait for this result
var scrResult = this.scraper.Scrape(gooResult.Uri);
if (scrResult.Body.Contains(pageShouldContain))
{
// Blocking up to this point ensures sequential execution and ability to return this final result
return scrResult.Body;
}
}
return null;
}
Come rispondere in modo reattivo?
Questa implementazione reattiva non funziona
private string ReactiveButUseless(string searchQuery, string titleShouldContain, string uriShouldContain, string pageShouldContain)
{
googler.Stream.Subscribe(
gooResult =>
{
if (gooResult.Title.Contains(titleShouldContain) && gooResult.Uri.Contains(uriShouldContain))
{
scraper.Stream.Subscribe(
scrResult =>
{
if (scrResult.Body.Contains(pageShouldContain))
{
// Get final result here, but no good as method has already returned (null)
var finalResult = scrResult.Body;
}
});
scraper.Scrape(gooResult.Uri);
}
});
googler.Search(searchQuery);
return null;
}
Esiste un modo per implementare una soluzione reattiva di lavoro?
- senza dover modificare l'implementazione di Google e Raschiamento perché devono rimanere puliti e riutilizzabili per altri scopi (altrimenti potrebbero passare in delegati)
- e senza bloccare? Potrebbe aspettare il risultato del flusso e del blocco, ma in questo caso non è meglio dell'implementazione del blocco non reattivo? O semplicemente non è possibile mescolare stili reattivi e non reattivi senza bloccare?