在使用language-ext库的一段代码中,只有在实际填充Option<>
中间结果时才能执行异步操作:
async Task<Option<MyEntity>> FindEntityAsync(string entityId)
{
Option<MyEntity> entityOpt = await GetEntityAsync(entityId);
if (entityOpt.IsSome)
{
await DoSomethingAsync(entityOpt.First());
}
return entityOpt;
}
// Task<Option<MyEntity>> GetEntityAsync(string entityId) { ... }
// DoSomethingAsync could either be:
// Task DoSomethingAsync(MyEntity entity) { ... }
// or:
// Task<Unit> DoSomethingAsync(MyEntity entity)
我正在寻找更多惯用的方式(对于这样的库)来实现同样的目标。
我尝试了以下但不起作用:
// look ma! No async/await here
Task<Option<MyEntity>> FindEntityAsync(string entityId)
{
Task<Option<MyEntity>> result =
from entity in GetEntityAsync(entityId)
from _ in DoSomethingAsync(entity).Map(Some)
select entity;
return result;
}
LanguageExt.ValueIsNoneException
为Option<>
时,我遇到了一些None
。
理想情况下,我希望使用IterXxx
类型的运算符,以便遍历包装的Option<MyEntity>
只有在有某些内容时才会这样做:
Task<Option<MyEntity>> FindEntityAsync(string entityId)
{
Task<Option<MyEntity>> result = GetEntityAsync(entityId);
result.IterXxxx(async entity => await DoSomethingAsync(entity));
return result;
}
但我找不到任何适合使用异步操作的签名。任何提示?
答案 0 :(得分:0)
特殊类型OptionAsync<T>
用于组合两个monad - Option和Async。
有关更多信息,请参阅github - https://github.com/louthy/language-ext/issues/206