DocumentDb上没有替换文档

时间:2017-04-17 15:22:41

标签: azure f# azure-cosmosdb

我正在使用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 个答案:

答案 0 :(得分:2)

F#Task计算与C#async的计算不同,因为它们不是当场执行的。简单地创建let x = async { printfn "Foo!" } // No output is generated here 计算无效:

Task

为了实际运行它,您需要指定如何运行它:在线程池上安排它,在当前线程上同步运行,转换为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!"

或者,可以&#34;运行&#34;通过将其包含在另一个异步计算中进行异步计算,然后以某种方式执行该异步计算:

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

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

.ui-autocomplete-input {
    /* Your CSS here */
}