为什么我不使用这个F#代码在OSX上输出,但我在Windows上输出

时间:2016-09-06 08:24:05

标签: macos visual-studio f# visual-studio-code ionide

我正在尝试使用macbook pro中的FSIvisual studio code插件在ionide上执行以下F#脚本代码。

#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 PC上的Windows 10中运行相同的代码时。代码产生预期的结果。即Please wait...和相册的title

为什么它在我的macbook无法正常工作?

的任何想法

1 个答案:

答案 0 :(得分:1)

在Visual Studio中,有一个托管FSI的进程,并使async计算的线程(池)保持活动状态。在命令行或VS代码的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
  得到了结果&lt; null&gt;