在scala中完成所有未来时执行任务

在scala中完成所有未来时执行任务,scala,playframework,playframework-2.0,Scala,Playframework,Playframework 2.0,我必须同时执行大约10到15个查询。其中,这些查询相互依赖,我将这些查询放在一个未来。否则,每个查询都有一个未来。现在,我只想在执行所有查询时,从包含未来的函数中得到一个指示成功或失败的响应 val f1 = future{SQL("insert into user_general_info (user_id, userFName, userLName, displayAs)" + "values(" + userId + ",'" + form.fname + "','" + form.l

我必须同时执行大约10到15个查询。其中,这些查询相互依赖,我将这些查询放在一个未来。否则,每个查询都有一个未来。现在,我只想在执行所有查询时,从包含未来的函数中得到一个指示成功或失败的响应

val f1 = future{SQL("insert into user_general_info (user_id, userFName, userLName, displayAs)" +
  "values(" + userId + ",'" + form.fname + "','" + form.lname + "','1')").executeInsert();
}

val f2 = future {
  SQL("insert into personal('" + userId + "',1,1,0,0,1,'ALL',0,'E')").executeInsert();
}

/*
and so on...upto about f1 to f14 futures...
*/
现在我所做的是:

val job = for {
  a1 <- f1
  a2 <- f2
  a3 <- f3
  a4 <- f4
  a5 <- f5
  a6 <- f6
  a7 <- f7
  a8 <- f8
  a9 <- f9
  a10 <- f10
  a11 <- f11
  a12 <- f12
  a13 <- f13
  a14 <- f14
} yield ()

var res: Boolean = false

job.onSuccess {
  case result => res = true
}

if(res)
  List((1, userId, username)) //1 means success
else
  List((-2, userId, username)) //-2 means failure
val job=for{

a1您可以使用
Futures.sequence
转换单个期货中的期货列表

代码示例来自:

另一方面,我建议返回一个
选项
,以指示成功或失败

if(res) Some(List(userId, userName))
else None

您可以使用
Futures.sequence
转换单个期货中的期货列表

代码示例来自:

另一方面,我建议返回一个
选项
,以指示成功或失败

if(res) Some(List(userId, userName))
else None

您展示的方法的另一个问题是,查询不是同时执行的,而是按顺序执行的。for comprehension for futures提供了一种方法,将futures链接到一个序列中,这样序列中后面的部分只有在之前的部分成功时才执行。tehlexx的答案是正确的,这正是您在本文中寻找的案例(即使用Future.sequence而非a进行理解)@MarkS你确定吗?如果他在for consummation之前定义了futures,那么所有futures都会立即以并发方式执行。for consummation只等待结果。因此,如果第一个futures需要的时间比第一个flatMap需要的时间最多,那么如果这个结果完成,那么所有其他flatMap链都会执行立即执行,因为所有其他的未来都已经完成。我可能错了。@akkie如果未来已经被创造了,你是对的。我被困在想象未来是在理解的范围内被创造的。当然,如果它们是在之前被创造的,那么它们将被不顾一切地执行(并行执行)。您展示的方法的另一个问题是,查询不是同时执行的,而是按顺序执行的。for comprehension for futures提供了一种将期货链接到一个序列的方法,这样序列中后面的那些查询只有在之前的查询成功时才执行。tehlexx的答案是正确的,这正是您在本书中寻找的s案例(即使用Future.sequence而非a进行理解)@MarkS你确定吗?如果他在for consummation之前定义了futures,那么所有futures都会立即以并发方式执行。for consummation只等待结果。因此,如果第一个futures需要的时间比第一个flatMap需要的时间最多,那么如果这个结果完成,那么所有其他flatMap链都会执行立即执行,因为所有其他的未来都已经完成。我可能错了。@akkie如果未来已经被创造,你是对的。我被困在想象中,未来是在理解中被创造的。当然,如果它们是在之前被创造的,那么它们将被不顾一切地执行(并行执行)。