文档未在 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
我将 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