为什么我没有使用此 F# 代码在 OSX 上获得输出,但我在 Windows 上获得输出
Why don't I get output on OSX with this F# code but I do on Windows
我正在尝试使用 visual studio code
中的 FSI
和 ionide
插件在我的 macbook pro
上执行以下 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 没有问题。
此外,当我在 Windows 10
PC 上 运行 Visual Studio 2013
中使用相同的代码时。该代码产生了预期的结果。即 Please wait...
和专辑的 title
。
知道为什么它不能在我的 macbook
上正常工作吗?
在 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
可能会打印:
Starting async
Please wait...
Downloaded quidem molestiae enim
Got result <null>
我正在尝试使用 visual studio code
中的 FSI
和 ionide
插件在我的 macbook pro
上执行以下 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 没有问题。
此外,当我在 Windows 10
PC 上 运行 Visual Studio 2013
中使用相同的代码时。该代码产生了预期的结果。即 Please wait...
和专辑的 title
。
知道为什么它不能在我的 macbook
上正常工作吗?
在 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
可能会打印:
Starting async
Please wait...
Downloaded quidem molestiae enim
Got result <null>