Elm 从 json 响应更新模型

Elm updating model from json response

我在通过我的一个操作从 JSON 响应更新模型时遇到问题。 这是设置:

我有这样的模型:

type alias Model =
  { totals: Totals.Total // all values are initialized as 0 or 0.0
  }

-- In other module

type alias Total =
  { days : Int
  , avgPerDay: Float
  , reports : Int
  , people : Int
  , locations : Int
  , totalCoffees : Int
  , coffeesPerDay: Float
  }

所述模型的解码器:

decodeTotal : Json.Decoder Total
decodeTotal =
  object7 Total
      ("days" := Json.int)
      ("avgPerDay" := Json.float)
      ("reports" := Json.int)
      ("people" := Json.int)
      ("locations" := Json.int)
      ("totalCoffees" := Json.int)
      ("coffeesPerDay" := Json.float)

要更新模型,调用以下 Http 请求:

getTotals : Effects Action
getTotals =
  Http.get Totals.decodeTotal ("/reports/totals")
    |> Task.toMaybe
    |> Task.map TotalsFetched
    |> Effects.task

来自服务器的响应是 200 OK 正文:{"days":347,"reports":1793,"avgPerDay":5.167147,"people":205,"locations":332,"coffees":146,"coffeesPerDay":0.42074928}

但是,在 TotalsFetched 操作中:

update : Action -> Model -> (Model, Effects Action)
update action model =
  case action of
    TotalsFetched totals ->
      log (toString totals)  -- logs Nothing
      ( { model | totals = Maybe.withDefault model.totals totals }
      , Effects.none
      )

我假设因为 totalsNothing,我的模型就保持在 Maybe.withDefault

中描述的那样

我不明白为什么 totals 是 Nothing 而不是来自服务器的 Decoded 响应。这是我的第一个榆树项目,所以如果我遗漏了一些对训练有素的人来说非常明显的东西,我不会感到惊讶。

您的 json 正在返回一个名为 coffees 的字段,而您的解码器正在寻找 totalCoffees.

您可能要考虑使用 Task.toResult 而不是 Task.toMaybe,因为这样您会在出现问题时收到返回的错误消息。