4

我正在尝试在我的使用和插件上执行以下 F #macbook pro脚本代码。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

在 Visual Studio 中有一个进程托管 FSI 并保持计算线程(池)处于async活动状态。在命令行或 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 回答