为什么 Cmd.OfAsync.perform 期望 'unit -> 'a' 而不是 'Message'?

问题描述 投票:0回答:1

据我了解

Cmd.OfAsyn.perform
有三个输入:

Cmd.OfAsync.perform
    asyncFunction   // The async function to perform
    input           // Input to the async function
    successMessage  // Message to dispatch on success

成功消息应该引用另一条消息,最终结果为

Cmd.none

在我的示例中,我想从浏览器下载文件,但收到错误:

This expression was expected to have 'unit -> 'a' but here has type 'Message'

我的代码是:

| DownloadFile ->
    let downloadCmd =
        Cmd.OfAsync.perform
            (fun _ -> async { Browser.Dom.window.location.href <- "/api/file/download"} )
            ()
            // The below line throws the error.
            FileDownloaded
    { model with IsDownloading = true }, downloadCmd
| FileDownloaded ->
    { model with IsDownloading = false }, Cmd.none

我不明白为什么

FileDownloaded
预计有类型单位'。 我的错误在哪里?

f# elm
1个回答
0
投票

我不明白为什么 FileDownloaded 预计具有类型 unit。我的错误在哪里?

实际上是

unit -> 'a
(在本例中
'a
Message
类型,请参阅 source)。
Cmd.OfAsync.perform
的最后一个参数是一个返回消息的函数,而不是消息本身。

要修复,请更改:

FileDownloaded

至:

(fun _ -> FileDownloaded)
© www.soinside.com 2019 - 2024. All rights reserved.