2016-07-28 2 views
0

Lassen Sie mich zuerst sagen, ich habe eine Lösung für dieses Problem, aber ich bin interessiert zu wissen, ob es einen besseren Weg gibt, und ob ich es tue etwas stimmt nicht.Technik, um eine ID mit einer HTTP-Abfrage zurück zu bekommen, wenn leere Array zurückgegeben wird

Ich habe eine Tabelle von Objekten auf dem Front-End einer Webanwendung, ich muss einige Daten für die Objekte asynchron laden, wie es pro Objekt benötigt wird. Der Server gibt ein JSON-Array zurück, das die Daten für dieses Objekt enthält, und die Daten enthalten den Schlüssel des Objekts, sodass ich das Objekt am Front-End mit seinen Daten aktualisieren kann. Wenn es keine Daten gibt, bekomme ich nur ein leeres Array, das leider keine Möglichkeit bietet, das Objekt zu aktualisieren, da ich nicht den Schlüssel habe, um es zu aktualisieren. Dies kann später zu einer anderen Abfrage führen, was eine Verschwendung von Zeit/Ressourcen bedeutet. Ich kann den Server nicht ändern, gibt es eine Möglichkeit, dies gut zu machen?

Meine aktuelle Lösung besteht darin, die Daten des Objekts einfach auf ein leeres Array zu setzen, bevor die Anfrage gesendet wird, und dann nur zu aktualisieren, wenn das Ergebnis empfangen wird, wenn das Ergebnis nicht leer ist.

Ich frage mich, ob es eine bessere/mehr idiomatische Möglichkeit gibt, dies zu tun.

Als Referenz verwende ich Elm mit PostgREST als Backend.

Antwort

2

Mit Curry- und Teilfunktionsanwendung können Sie angeben, welche Objekt-ID aktualisiert werden soll.

Ich gehe davon aus Sie einen Code ähnlich wie diese haben:

type Msg 
    = ... 
    | FetchData Int 
    | DataFetched [Data] 
    | DataFetchFail Http.Error 

-- inside the update function 
update msg model = 
    case msg of 
    ... 
    FetchData id = 
     model ! [ Task.perform DataFetchFail DataFetched (Http.post ...) ] 

Wenn Sie Ihren DataFetched Konstruktor definieren die ID als ersten Parameter enthalten, können Sie teilweise Anwendung verwenden, um die ID enthalten für Zukunftssuche, unabhängig davon, was der Server zurückgibt.

Hier ist die gleiche Code Brocken mit dieser Idee:

type Msg 
    = ... 
    | FetchData Int 
    | DataFetched Int [Data] 
    | DataFetchFail Http.Error 

-- inside the update function 
update msg model = 
    case msg of 
    ... 
    FetchData id = 
     model ! [ Task.perform DataFetchFail (DataFetched id) (Http.post ...) ] 

Sie können auch die ID an die Fehlermeldung Nachrichten für feinkörnige Fehler hinzufügen.

+0

Guter Ruf, sollte daran gedacht haben! Ich werde aktualisieren und akzeptieren. – jgon

Verwandte Themen