首页 文章

文档未在DocumentDb上替换

提问于
浏览
1

我正在使用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 回答

  • 2

    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!"
    

    或者,可以通过将异步计算包含在另一个异步计算中来“运行”异步计算,该异步计算本身然后以某种方式执行:

    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
    

相关问题