2017-04-17 11 views
1

私はAzureのDocumentDbをF#で使用しています。新しいドキュメントを作成し、すべてのドキュメントをロードし、whereフィルタを適用したIDでドキュメントをロードできました。しかし、私は文書を置き換えることはできませんし、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とは異なり、実際には実行されません。変換、スレッドプールでそれをスケジュールし、現在のスレッド上で同期的に実行します。

let x = async { printfn "Foo!" } // No output is generated here 

実際にそれを実行するために、あなたはがそれを実行する方法を指定する必要がありません:単にasync計算を作成することは何もありませんTaskなど例:

let x = async { printfn "Foo!" } 
Async.RunSynchronously x // Prints "Foo!" 

あるいは、缶自体は、その後、いくつかの方法で実行される「ラン」は、別の非同期計算に含めて非同期演算、:

だから、

、あなたの第二の例を実行する(そして、できれば返されたエラーを参照してください)するためには、あなたが実際に実行たワークフローに必要があります。

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

ええ、私は彼らが異なっていた知っていたが、私のC#経験は私に 'RunSynchronously'コマンドを気にしました。あなたがそれを与えた文脈では、より意味があります。私は混乱するエラーを得ることができた、それを解決し、今私はドキュメントを更新することができます。ありがとう! – Max

+0

うれしい私は助けることができます。 –

関連する問題