2017-04-17 75 views
1

我正在使用Azure的DocumentDb和F#,并且我已经能够创建新文档,加载所有文档,并通过Id加载文档,并应用where过滤器。但我无法替换任何文档,并且F#中的文档很少。DocumentDb上没有被替换的文档

这是我使用的更新文档的功能:

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 

这里,是Async<ResourceResponse<Document>>类型。我似乎无法找到一种方法将其从Async包装中取出,并且一旦我做了,我不知道如何将Document转换为MyObject

因此,简言之:

  • 的问题是,我无法更新文件
  • 我怀疑我得到一个错误信息或一些东西是我忽略的任务。

回答

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 
+1

是的,我知道他们是不同的,但我的C#经验让我对“RunSynchronously”命令保持警惕。在你给它的上下文中更有意义。我能够得到一个令人困惑的错误,解决这个问题,现在我可以更新文档。谢谢! – Max

+0

很高兴我能帮到你。 –