方法说明:
给定期货
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 {中我得到了以下编译错误:
实现限制:在value类中不允许嵌套类,此限制计划在后续版本中删除。
有人能给我解释一下这个错误并给我一个解决办法吗?
发布于 2013-11-27 21:56:32
这个特定的问题可以通过将该方法移出值类(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)
}即使是课程页面上的常见问题也没有进一步解释这里发生了什么,只是说这个特性是实验性的。异步{}引入宏,因此难以跟踪.根据这篇文章,可能在这条线的某个地方创建了一个嵌套类,这在值类中是不允许的。
还建议您从现在起不要使用异步{},而应等待{}。
N.b.你的代码不起作用,但我不应该破坏乐趣,因为问题不是关于那个的
发布于 2013-11-27 21:55:40
从常见问题:
Scala异步特性即将发布,部分是实验性的。
作为在值类中使用Scala异步的一种解决方法,请考虑使用以下技巧将异步调用移至value类之外:
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和其他朋友)。
https://stackoverflow.com/questions/20252687
复制相似问题