【问题标题】:Dynamic Chart - Fable动态图表 - 寓言
【发布时间】:2017-12-28 03:47:17
【问题描述】:

我有一个使用 fable-elmish 的模型更新视图架构的项目。而且我必须每分钟下载文件并阅读这些文件。更新功能里怎么下载,怎么读取解析成Json?

我也需要使用 Fable 创建动态图表。有人知道怎么做吗?

我的部分代码在这里:

let update (msg : Msg) (model : Model) =
  match msg with
  | GetData -> 
    model, 
    Cmd.ofPromise 
      (fun () -> 
        promise {
          let wc = new WebClient()
          wc.DownloadData("https://www.quandl.com/api/v1/datasets/LBMA/SILVER.json", "SILVER.json")
          wc.DownloadData("https://www.quandl.com/api/v1/datasets/LBMA/GOLD.json", "GOLD.json")
          // Read 2 files
          // Return 2 Json.Object
        })
      ()
      (fun silver gold -> GotData silver gold)
      (fun e -> GotError e.Message)
  | GotData silver gold -> 
    (Model.SilverData silver, Model.GoldData gold), // I think this doesn't work
    Cmd.ofPromise 
      (fun () -> Promise.sleep 60000)
      ()
      (fun () -> GetData)
      (fun e -> GetData)

【问题讨论】:

    标签: f# f#-data fsharpchart fable-f#


    【解决方案1】:

    如果您的 Elmish 应用程序中有一个周期性事件应该导致某些操作,我会使用 subscription。以下代码 sn -p 显示了一个函数,该函数设置一个间隔,该间隔会导致每 10 分钟一次命令调度。

    let timer initial =
        let sub dispatch =
            window.setInterval(fun _ -> dispatch LoadDataSet; console.log("Timer triggered")
                , 1000 * 60 * 10) |> ignore
    
        Cmd.ofSub sub
    

    您可以使用Program.withSubscription 函数将订阅添加到您的主调度循环中。

    我会使用Fable PowerPack 包来支持它的fetchpromise 来获取数据集。以下代码将从您指定的端点获取文档,将它们解析为 DataSet 类型的值,并在 promise 的成功路径上将它们作为 SilverAndGold 模型类型的值返回。

    type DataSet =
        { column_names : string list
          data : (string * float * float * float) list }
    
    type SilverAndGold =
        { Silver : DataSet
          Gold : DataSet }
    
    ...
    
    let fetchDataSets () = promise {
        let! silverData = Fetch.fetchAs<DataSet> "https://www.quandl.com/api/v1/datasets/LBMA/SILVER.json" []
        let! goldData = Fetch.fetchAs<DataSet> "https://www.quandl.com/api/v1/datasets/LBMA/GOLD.json" []
    
        return { Silver = silverData; Gold = goldData }
    }
    

    在 Elmish 应用程序的更新功能中,您可以看到如何触发承诺执行。在我们的订阅发送的每条LoadDataSet 消息上,我们都会创建一个承诺命令,这会导致包含数据集的DataSetLoaded 消息或错误。

    let update (msg:Msg) (model:Model) =
        match msg with
        | LoadDataSet ->
            model, Cmd.ofPromise fetchDataSets () DataSetLoaded Error
        | DataSetLoaded silverGold ->
            // here you could process you silver and gold datasets
            console.log silverGold
            Some silverGold, Cmd.none
        | Error e -> model, Cmd.none
    

    我们可以使用Fable bindingsRecharts 库来绘制我们的数据集。以下代码展示了我们如何转换和修剪数据集(在浏览器中渲染所有数据点会非常费力)并将它们显示为view 函数中的折线图。

    type ChartDataPoint =
        { Date : string
          Usd : float
          Gbp : float
          Euro : float }
    
    let toChartData (dataSet : DataSet) =
        dataSet.data
        |> List.map (fun (dt, usd, gbp, eur) ->
            { Date = dt; Usd = usd; Gbp = gbp; Euro = eur } )
        |> Array.ofList
        |> Array.take 1000
        |> Array.rev
    
    let priceChart (chartData : ChartDataPoint[]) =
        lineChart
            [ Chart.Data chartData
              Chart.Width 600.
              Chart.Height 500. ] [
            xaxis [ Cartesian.DataKey "Date" ] []
            yaxis [] []
            tooltip [] []
            legend [] []
            line [ Cartesian.Type "monotone"; Cartesian.DataKey "Gbp" ] []
            line [ Cartesian.Type "monotone"; Cartesian.DataKey "Euro" ] []
            line [ Cartesian.Type "monotone"; Cartesian.DataKey "Usd" ] []
        ]
    
    let view (model : SilverAndGold option ) dispatch =
      div [ ] [
            match model with
            | Some sets ->
                yield h2 [] [ str "Silver" ]
                yield priceChart (toChartData sets.Silver)
                yield h2 [] [ str "Gold" ]
                yield priceChart (toChartData sets.Gold)
            | None ->
                yield h2 [] [ str "No data :("]
        ]
    

    我制作了一个很小的 ​​Elmish 应用程序,其中包含所有这些主题。您可以在此处找到here 并根据您的需要进行调整。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-15
      • 2021-09-19
      • 2020-07-19
      • 2020-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多