4

inとプラグインmacbook proを使用して、次の F# スクリプト コードを実行しようとしています。FSIvisual studio codeionide

#r "packages/Newtonsoft.Json.9.0.1/lib/net40/Newtonsoft.Json.dll"
#r "System.Net.Http"

open System
open System.Net.Http
open Newtonsoft.Json

let client = new HttpClient()

type AlbumInfo = { userId:int; id:int; title:string }

let url = "https://jsonplaceholder.typicode.com/albums/1"

async {
    let! res = Async.AwaitTask <| client.GetAsync(url)
    let! content = Async.AwaitTask <| res.Content.ReadAsStringAsync()
    let  x = JsonConvert.DeserializeObject<AlbumInfo>(content)

    printfn "%s" x.title
} |> Async.Start

printfn "Please wait..."

しかし、私は別の出力を取得しませんPlease wait...。ただし、https://jsonplaceholder.typicode.com/albums/1ブラウザに入力すると、期待どおりのJson応答が得られます。したがって、API に問題なくアクセスできることはわかっています。

Visual Studio 2013また、Windows 10PCで同じコードを実行すると。コードは期待される結果を生成します。すなわちPlease wait...titleアルバムの。

それが私の上で正しく動作しない理由はありmacbookますか?

4

1 に答える 1

1

asyncVisual Studio には、FSI をホストし、計算用のスレッド (プール) を維持するプロセスがあります。コマンド ラインまたは VS Code の FSI では、FSI は、メイン スレッドが書き込みを完了するとすぐに終了しますPlease wait...(通常は、スレッド プールで計算が開始される前です)。

計算の副作用を観察したい場合は、asyncその結果を待つ必要があります (この例ではunit):

let computation = async {
    printfn "Starting async"
    let! res = Async.AwaitTask <| client.GetAsync(url)
    let! content = Async.AwaitTask <| res.Content.ReadAsStringAsync()
    let x = JsonConvert.DeserializeObject<AlbumInfo>(content)
    printfn "Downloaded %s" x.title
}

async {
    let! started = computation |> Async.StartChild
    let! _ = Async.Sleep 1 // only here to get interleaved ouput
    printfn "Please wait..."
    let! res = started
    printfn "Got result %A" res
} |> Async.RunSynchronously

おそらく印刷されます:

非同期を開始し
ています お待ちください...
quidem molestiae enim をダウンロードし
ました 結果 <null>

于 2016-09-07T02:06:14.083 に答える