Техника получения идентификатора с помощью запроса 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 для более детальных сообщений об ошибках.

Другие вопросы по тегам