文档未在 DocumentDb 上被替换

Document not being replaced on DocumentDb

我将 Azure 的 DocumentDb 与 F# 结合使用,我已经能够创建新文档、加载所有文档以及通过 Id 加载文档,并应用了 where 过滤器。但我无法替换任何文档,而且 F# 中的文档很少。

这是我用来更新文档的函数:

let update (c : MyObject) =
    let cli = createClient()
    cli.ReplaceDocumentAsync(documentUri(), c)
    |> Async.AwaitTask
    |> ignore
    c

createClient 只是创建一个 DocumentClient 的新实例,使用相同的参数让我加载和保存新文档。同样,documentUri() 在其他函数中起作用。

我的 猜测 是我实际上从任务中得到了有用的响应,我忽略了它(基于我见过的例子)。然而,事实证明,试图获得这种回应很困难。

这是我尝试使用的一种方法,但最终得到了一种我似乎无法转换的类型:

let update2 ( c : MyObject) =
    let cli = createClient()
    let updatedDoc = async {
        return! cli.ReplaceDocumentAsync(documentUri(), c) |> Async.AwaitTask
    }
    updatedDoc

这里,updatedDoc是类型Async<ResourceResponse<Document>>。我似乎无法找到将它从 Async 包装器中取出的方法,一旦我这样做了,我不确定如何将 Document 变成 MyObject.

所以,总而言之:

F# async 计算与 C# Task 的不同之处在于它们不是当场执行的。简单地创建一个 async 计算什么都不做:

let x = async { printfn "Foo!" }  // No output is generated here

为了真正运行它,你需要指定如何到运行它:在线程池上安排它,运行 在当前线程上同步,转换成Task,等等 例如:

let x = async { printfn "Foo!" }
Async.RunSynchronously x // Prints "Foo!"

或者,可以 "run" 将异步计算包含在另一个异步计算中,然后以某种方式执行它本身:

let y = async {
     do! x
     printfn "Bar!"
   }

Async.RunSynchronously y  // Prints "Foo!" and then "Bar!"

因此,为了执行您的第二个示例(并希望看到返回的错误),您实际上需要 运行 结果工作流:

let update2 ( c : MyObject) =
    let cli = createClient()
    let updateDoc = cli.ReplaceDocumentAsync(documentUri(), c) |> Async.AwaitTask
    Async.RunSynchronously updateDoc