【发布时间】:2018-03-19 19:25:07
【问题描述】:
在之前基于同步调用的question 的基础上,我们如何在以下场景中处理异步方法。
let fetch1 (result: string) : Result<string, string> =
try
use request = WebRequest.Create("http://bing.com") :?> HttpWebRequest
use response = request.GetResponse()
use reader = new StreamReader(response.GetResponseStream())
let html = reader.ReadToEnd()
Ok "success"
with
| :? WebException as e ->
Error "error with the url"
let fetch2 (result: string) : Result<string, string> =
try
use request = WebRequest.Create("http://google.com") :?> HttpWebRequest
use response = request.GetResponse()
use reader = new StreamReader(response.GetResponseStream())
let html = reader.ReadToEnd()
Ok "success"
with
| :? WebException as e ->
Error "error with the url"
let fetch3 (result: string) : Result<string, string> =
try
use request = WebRequest.Create("http://invalid.com") :?> HttpWebRequest
use response = request.GetResponse()
use reader = new StreamReader(response.GetResponseStream())
let html = reader.ReadToEnd()
Ok "success"
with
| :? WebException as e ->
Error "error with the url"
测试
let chain = fetch1 >> Result.bind fetch2 >> Result.bind fetch3
match chain("") with
| Ok message -> Debug.WriteLine(message)
| Error error -> Debug.WriteLine(error)
尝试
let fetch1 (result: string) :Result<string, string> = async {
try
use! request = WebRequest.Create("http://bing.com") :?> HttpWebRequest
use response = request.GetResponse()
use reader = new StreamReader(response.GetResponseStream())
let html = reader.ReadToEnd()
Ok "success"
with
| :? WebException as e ->
Error "error with the url"
}
错误
此表达式的类型为“Result”,但此处的类型为“Async'
【问题讨论】:
-
好吧,您将表达式更改为
async,但您仍然坚持其类型应为Result<string, string>。难怪编译器会感到困惑。你有什么不清楚的地方? -
返回类型应该是什么,以及代码中的任何修复,我相信类似
use! request,感谢答案中的代码帮助。谢谢 -
async计算属于Async<_>类型,因为编译器会很有帮助地告诉您。您需要决定应该在Async<_>中包含什么类型 - 即您的异步计算应该产生什么类型。 -
对不起,我没有你流利,我是初学者,有完整的代码图就可以理解了。
-
你的意思是像这样
Async<Result<Article, Error>>?我现在在正文中遇到其他错误,这就是为什么我建议一个完整的代码示例
标签: asynchronous f# function-composition