gpt4 book ai didi

asynchronous - 异步工作流和尝试/使用的 F# 问题

转载 作者:行者123 更新时间:2023-12-01 08:56:44 24 4
gpt4 key购买 nike

我很难将一个简单的功能放在一起。

考虑以下定义:

type Entity = {Id:int;Data:string}

type IRepository =
abstract member SaveAsync: array<Entity> -> Task<bool>
abstract member RollBackAsync: array<Entity> -> Task<bool>

type INotification =
abstract member SaveAsync: array<Entity> -> Task<bool>

使用Task<T>因为它们是用其他 .NET 语言开发的库。

(为了示例,我创建了此代码)

基本上我想把数据保存在repository服务中,然后把数据保存在通知服务中。但是,如果第二个操作失败,并且包含异常,我想回滚存储库中的操作。那么有两种情况我想调用回滚操作,第一种 if notification.SaveAsync返回 false,如果抛出异常则返回第二个。当然,我想编写一次回滚调用的代码,但我找不到方法。

这是我尝试过的:

type Controller(repository:IRepository, notification:INotification) =

let saveEntities entities:Async<bool> = async{

let! repoResult = Async.AwaitTask <| repository.SaveAsync(entities)
if(not repoResult) then
return false
else
let notifResult =
try
let! nr = Async.AwaitTask <| notification.SaveAsync(entities)
nr
with
| _-> false

if(not notifResult) then
let forget = Async.AwaitTask <| repository.RollBackAsync(entities)
return false
else
return true
}

member self.SaveEntitiesAsync(entities:array<Entity>) =
Async.StartAsTask <| saveEntities entities

但不幸的是,我在 let! nr = ... 上遇到了编译器错误。说:这个结构只能在计算表达式中使用

这样做的正确方法是什么?

最佳答案

问题是当你在计算表达式中使用 let v = e 时,表达式 e 是一个普通的表达式,不能包含更多的异步构造。这正是这里发生的事情:

let notifResult =
try
let! nr = Async.AwaitTask <| notification.SaveAsync(entities)
nr
with _-> false

你可以把它变成一个嵌套的 async block :

let! notifResult = async {
try
let! nr = Async.AwaitTask <| notification.SaveAsync(entities)
return nr
with _-> return false }

关于asynchronous - 异步工作流和尝试/使用的 F# 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27131774/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com