【发布时间】:2016-09-12 15:36:48
【问题描述】:
我正在将代码从同步样式迁移到异步样式。问题相当简单:调用一系列函数,并在第一个函数处停止以返回非错误结果(返回该值,否则返回最后一个计算值)。我开始了:
def find(fs: Seq[Function0[Int]], result: Int = -1): Int = {
if (fs.isEmpty) result
else {
val res = fs.head()
if (res != 0) res
else find(fs.tail, res)
}
}
但是,如果函数变得异步,(即返回 Future[Int])我无法获得正确的调用。例如,
def ffind(ffs: Seq[Function0[Future[Int]]], result: Future[Int] = Future { -1 }): Future[Int] = {
if (ffs.isEmpty) result
else ffind(ffs.tail, ffs.head())
}
效果很好,但它会评估所有函数,而不考虑返回值。但类似:
def findBad(ffs: Seq[Function0[Future[Int]]], result: Future[Int] = Future { -1 }): Future[Int] = {
if (ffs.isEmpty) result
else {
ffs.head() map { res =>
if (res != 0) res
else findBad(ffs.tail, Future(res))
}
}
}
不进行类型检查。有什么建议么?我们可以假设函数的每次调用都是昂贵的,因此不应该调用两次,也不应该在序列中的第一个“成功”调用之后调用。 TIA
【问题讨论】:
-
嗨,这个问题解决了吗?
-
是的,很抱歉我没有更新问题,只是支持答案。非常感谢!
-
我只是在清理,因为我有强迫症所以我想知道我的回答是否解决了你的问题,在这种情况下你应该将其标记为已接受,或者它是不充分的,其中万一我会删除它。