Asynchronous 如何在F中使用Async和AsyncResult#
使用FsToolkit.ErrorHandling库,让我们举一个例子:Asynchronous 如何在F中使用Async和AsyncResult#,asynchronous,f#,Asynchronous,F#,使用FsToolkit.ErrorHandling库,让我们举一个例子: let doStuff = result { let! x = doSomething "hello" let! y = doAnotherthing "world" let z = combineTwo x y return z } 现在,我有一个名为combinedTwoAsync的combine
let doStuff =
result {
let! x = doSomething "hello"
let! y = doAnotherthing "world"
let z = combineTwo x y
return z
}
现在,我有一个名为combinedTwoAsync的combinedTwo的异步版本:
let doStuff =
result {
let! x = doSomething "hello"
let! y = doAnotherthing "world"
let z = combineTwoAsync x y |> Async.AwaitTask |> Async.RunSynchronously
return z
}
但是我看到它们有一个asyncResult表达式,它返回一个异步类型
但是,我不能这样做:
let doStuff =
asyncResult {
let! x = doSomething "hello"
let! y = doAnotherthing "world"
let! z = combineTwoAsync x y
return z
}
因为doSomethingAsync只是一个不返回结果对象的异步函数
我猜这是为了所有异步函数都将返回一个异步类型而设计的,但我正试图弄清楚如何在结果计算表达式中使用异步调用(对外部libs的调用)来返回一个异步类型
希望这有一定的意义:)一般来说,对于函子(其中async
是其中之一),可以使用map
对函子的值应用某种类型的转换,例如将其包装在结果中。例如,Ok
:
//xAsyncResult:Async
让xAsyncResult=doSomething“hello”|>Async.map Result.Ok
令人惊讶的是,Async.map
不是一件事。甚至还有
但没关系:实施起来很容易:
module Async =
map f a = async {
let! x = a
return f a
}
然后:
let doStuff =
asyncResult {
let! x = doSomething "hello" |> Async.map Result.Ok
let! y = doAnotherthing "world" |> Async.map Result.Ok
let! z = combineTwoAsync x y
return z
}