我正在使用 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
不同,因为它们不会立即执行。简单地创建一个异步
计算不会执行任何操作:
let x = async { printfn "Foo!" } // No output is generated here
为了实际运行它,您需要指定如何运行它:将其调度到线程池上、在当前线程上同步运行、转换为任务
等。例如:
let x = async { printfn "Foo!" }
Async.RunSynchronously x // Prints "Foo!"
或者,可以通过将异步计算包含在另一个异步计算中来“运行”异步计算,然后该异步计算本身会以某种方式执行:
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
关于azure - DocumentDb 上的文档未被替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43454358/