Sto cercando di capire quale sia il modo appropriato per affrontare questo problema in modo funzionale. Presumo che ci sia una struttura dati o una tecnica funzionale che renderà questo facile da gestire.
Il problema è che sto facendo una chiamata API per ottenere due bit di dati, ne uso uno in un'altra chiamata API e se la chiamata funziona, allora uso l'altro bit di dati in una seconda chiamata API. Sto avendo difficoltà a far scorrere tutto insieme. Naturalmente le chiamate API possono fallire, quindi restituiscono Either e mi piacerebbe che fosse tutta una lunga catena, ma non riesco a capire come farlo.
In una lingua imperativa lo farei:
let response = apiCall1();
// error handling, return failure
// do some processing on the response
let json = getJsonBody(response);
let bit1 = json['bit1'];
let bit2 = json['bit2'];
let response2 = apiCall2(bit1);
// error handling, return failure
let response3 = apiCall3(bit2);
// error handling, return failure
return response3 // return success
Se il risultato di ogni chiamata API era l'input della funzione successiva, avrei fatto qualcosa del genere:
return apiCall1()
.map(jsonBody)
.map(apiCall2)
.map(jsonBody)
.map(apiCall3)
Quindi qual è il modo funzionale per ottenere questo risultato?
apiCall1 ----
| |
| |
v |
apiCall2 |
| |
| |
v |
apiCall3 <---|