Техника получения идентификатора с помощью запроса http, когда возвращается пустой массив
Позвольте мне сначала сказать, что у меня есть решение этой проблемы, но мне интересно знать, есть ли лучший способ, и делаю ли я что-то не так.
У меня есть таблица объектов во внешнем интерфейсе веб-приложения, мне нужно асинхронно загрузить некоторые данные для объектов, так как это необходимо для каждого объекта. Сервер возвращает массив JSON, содержащий данные для этого объекта, а данные содержат ключ объекта, поэтому я могу обновить объект на внешнем интерфейсе его данными. Когда данных нет, я просто получаю пустой массив, который, к сожалению, не представляет способа обновления объекта, поскольку у меня нет ключа для его обновления. Это может привести к другому запросу позже, что является пустой тратой времени / ресурсов. Я не могу изменить сервер, есть ли способ сделать это красиво?
Мое текущее решение состоит в том, чтобы просто установить данные объекта в пустой массив перед отправкой запроса, а затем просто обновить, когда результат получен, если результат непустой.
Мне было интересно, есть ли лучший / более идиоматический способ сделать это.
Для справки, я использую Elm с PostgREST в качестве бэкэнда.
1 ответ
Вы можете использовать каррирование и частичное применение функции, чтобы указать, какой ID объекта должен быть обновлен.
Я предполагаю, что у вас есть код, похожий на этот:
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 ...) ]
Если вы определите свой DataFetched
Конструктор для включения идентификатора в качестве первого параметра позволяет использовать частичное приложение для включения идентификатора для будущего поиска независимо от того, что возвращает сервер.
Вот те же фрагменты кода с этой идеей:
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 ...) ]
Вы также можете добавить идентификатор в сообщение Fail для более детальных сообщений об ошибках.