我正在使用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
.
所以,总结一下:
-
问题是我无法更新文档
-
我怀疑我忽视了 .
1 回答
F#
async
计算与C#Task
的计算不同,因为它们不是当场执行的 . 简单地创建一个async
计算什么都不做:为了实际运行它,您需要指定如何运行它:在线程池上安排它,在当前线程上同步运行,转换为
Task
等 . 例如:或者,可以通过将异步计算包含在另一个异步计算中来“运行”异步计算,该异步计算本身然后以某种方式执行:
因此,为了执行第二个示例(并希望看到返回的错误),您需要实际运行生成的工作流: