方法描述:
给定一个期货列表
fs
,返回持有该列表的未来 来自fs
的所有期货的价值。返回的未来已经完成 只有fs
中的所有期货都已完成。价值 列表中的顺序与对应的期货fs
的顺序相同。如果 任何期货fs
都会失败,结果未来也会失败。
这就是我所做的:
implicit class FutureCompanionOps[T](val f: Future.type) extends AnyVal {
/***
//Some others method
***/
def all[T](fs: List[Future[T]]): Future[List[T]] = async {
var fsVar = fs;
val l = List()
while(fsVar.nonEmpty){
await{fsVar.head} :: l
fsVar = fsVar.tail
}
l
}
}
但是我在此行def all[T](fs: List[Future[T]]): Future[List[T]] = async {
收到以下编译错误:
实现限制:值类中不允许嵌套类 计划在后续版本中删除此限制。
有人可以解释我这个错误并告诉我一个解决方法吗?
答案 0 :(得分:5)
来自常见问题:
Scala Async功能即将推出首发版,部分是实验性的。
作为在值类中使用Scala Async的解决方法,请考虑使用以下技巧将异步调用移到值类之外:
class FutureOps[T](f: Future[T]) extends AnyVal {
def foo: Future[T] = fooImpl(f)
}
def fooImpl(f: Future[T]) = async {
val x = await { f }
throw new Exception
}
如果那个或其他代码杂耍和重构无法解决问题,请考虑使用常规功能组合器,如map
,flatMap
,continueWith
和其他朋友。
答案 1 :(得分:5)
可以通过将该方法移到值类(FutureCompanionOps)之外来解决此特定问题。
def allOutside[T](fs: List[Future[T]]): Future[List[T]] = async {
var fsVar = fs;
val l = Nil
while(fsVar.nonEmpty){
await{fsVar.head} :: l
fsVar = fsVar.tail
}
l.toList
}
implicit class FutureCompanionOps[T](val f: Future.type) extends AnyVal {
/***
//Some others method
***/
def all[T](fs: List[Future[T]]): Future[List[T]] = allOutside(fs)
}
即使是FAQ on the course page也没有提供有关此处发生的事情的进一步说明,只是该功能是实验性的。 async {}会导致宏变得难以跟踪,因此......可能会在某行的某个位置创建一个嵌套类,根据this article不允许在值类中使用。
现在建议您不要使用async {}并等待{}。
N.b。你的代码不起作用,但我不应该破坏乐趣,因为问题不是那个