我有现有的代码,可以调用多个期货。例如:
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
我不想做。上面的代码显然是不正确的,但我很困惑如何做到这一点,而不重复一堆代码。任何建议都表示赞赏。
答案 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
实际上并不是“火上浇油而忘记”。当且仅当result
,future1
和future2
全部成功时,您的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>