【问题标题】:Document not being replaced on DocumentDbDocumentDb 上的文档没有被替换
【发布时间】:2017-04-17 23:48:57
【问题描述】:

我将 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。

所以,总结一下:

  • 问题是我无法更新文档
  • 我怀疑我从忽略的任务中收到错误消息或其他内容。

【问题讨论】:

    标签: azure f# azure-cosmosdb


    【解决方案1】:

    F# async 计算与 C# Tasks 的不同之处在于它们不会立即执行。简单地创建一个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!"
    

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

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

    【讨论】:

    • 是的,我知道它们是不同的,但我的 C# 经验让我对 RunSynchronously 命令保持警惕。在您给出的上下文中,它更有意义。我能够得到一个令人困惑的错误,解决它,现在我可以更新文档。谢谢!
    • 很高兴我能帮上忙。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多