如何撰写“期货”清单?

时间:2015-06-30 14:38:16

标签: scala future

我有一个Promises的集合。我一直在寻找一种有效的方法来组成结果Futures。目前我发现将它们组合起来的最简洁方法是使用scalaz Monoid,如下所示:

  val promises = List(Promise[Unit], Promise[Unit], Promise[Unit])

  promises.map(_.future).reduce(_ |+| _).onSuccess {
    case a => println(a)
  }  

  promises.foreach(_.success(()))

有没有一种干净的方法可以做到这一点,不需要scalaz?

集合中Futures的数量会有所不同,很多中间集合是不可取的。

2 个答案:

答案 0 :(得分:7)

您可以使用Future.traverse

import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.{ Future, Promise }

val promises = List(Promise[Unit], Promise[Unit], Promise[Unit])
Future.traverse(promises)(_.future)

这会给你一个Future[List[Unit]],它没有完全符合"许多中间收藏品和#34;但也不一定是理想的。 Future.reduce也有效:

Future.reduce(promises.map(_.future))((_, _) => ())

这将返回一个Future[Unit],当满足所有期货时,该var admobApp = angular.module('myapp', ['ionic']) .run(function($ionicPlatform, $ionicPopup) { $ionicPlatform.ready(function() { if(window.plugins && window.plugins.AdMob) { var admob_key = device.platform == "Android" ? "ANDROID_PUBLISHER_KEY" : "IOS_PUBLISHER_KEY"; var admob = window.plugins.AdMob; admob.createBannerView( { 'publisherId': admob_key, 'adSize': admob.AD_SIZE.BANNER, 'bannerAtTop': false }, function() { admob.requestAd( { 'isTesting': false }, function() { admob.showAd(true); }, function() { console.log('failed to request ad'); } ); }, function() { console.log('failed to create banner view'); } ); } }); }); 将被满足。

答案 1 :(得分:3)

Future.sequence是你想要的方法。