我有一个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
的数量会有所不同,很多中间集合是不可取的。
答案 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
是你想要的方法。