为了理解条件

时间:2017-04-21 05:20:42

标签: scala

我有现有的代码,可以调用多个期货。例如:

val result = for {
      _ <- future1 // Fire and forget call
      r2 <- future2
      r3 <- future3
    } yield (r2,r3)

我想做的是我想有条件地做_ <- future1。我想做的是

val result = for {
          if(shouldFireAndForget) {_ <- future1 }// Fire and forget call
          r2 <- future2
          r3 <- future3
        } yield (r2,r3)

shouldFireAndForget值是一个布尔值,例如可以从配置文件中读取。如果设置为true,我想进行future1来电,如果false我不想做。上面的代码显然是不正确的,但我很困惑如何做到这一点,而不重复一堆代码。任何建议都表示赞赏。

2 个答案:

答案 0 :(得分:4)

您可以尝试这样的事情:

val result = for {
  _ <- if (!shouldFireAndForget) future1 else Future.successful(())
  r2 <- future2
  r3 <- future3
} yield (r2,r3)

&#34;技巧&#34;是if的结果,在任何一种情况下都必须是未来。

答案 1 :(得分:2)

嗯......这里需要理解的重点很少。

让我们说你有以下代码,

val future1 = Future{...}
val future2 = Future{...}
val future3 = Future{...}

您需要知道的是,这些期货会在您val futureX = Future{...}后立即开始执行,无论您是否在某处使用它们。

现在查看原始代码,

val result = for {
  _ <- future1 // Fire and forget call
  r2 <- future2
  r3 <- future3
} yield (r2,r3)

在这里,future1实际上并不是“火上浇油而忘记”。当且仅当resultfuture1future2全部成功时,您的future3才会成功。如果fails result中的任何一个future1也会失败。正如你所说result是&#34;开火而忘记&#34;,如果future1失败,我认为你不希望result失败。

如果你真的希望你的future1免于&#34;开火,忘记&#34; if (fireAndForget) { val future1 = Future{...} } val result = for { r2 <- Future{...} r3 <- Future{...} } yield (r2,r3) 然后你应该这样做,

<form action="<?php echo Mage::getBaseUrl()."multipleimageupload/index/save"; ?>" method="POST" enctype="multipart/form-data">
    <input type="file" name="filename[]" multiple="multiple"> 
    <input type="submit" name="save">
</form>