2017-01-24 5 views
0

私は未来の結果をブロック操作なしで得たいと思っています。 私は「待つ」との私のコードを記述する場合、それは動作しますが、それがブロックしているので、それは私のために良いではありません。"await"を使わずにFutureの結果を得るには

val t: Future[MatchResult[Personne]] = db.getPersonne(userId).map(_.get must beEqualTo(personne)) 
t.await 

を私はmapで自分のコードを変更しようとしました:

val r: Future[MatchResult[Personne]] = db.getPersonne(userId).map(_.get must beEqualTo(personne)) 
    r.map { 
    case [email protected] => r 
    case isNot => isNot 
    } 

けどこのエラーがあります。

found : scala.concurrent.Future[org.specs2.matcher.MatchResult[Personne]]
[error] required: org.specs2.specification.create.InterpolatedFragment

+4

「未来」のコンテキストにいるときは、待たずに出ることはできません。しかし、 'onComplete'を使って、準備ができたら結果を消費することができます。 – marstran

+0

あなたの質問は一般的な先物ではなくspec2に関するようです。一般的には、 'fut.foreach'や' fut.map'を使って未来の値を扱うことができます。 –

答えて

2

Specs2が表示されているので、非同期機能をテストするためのヘルパーがあります。

import org.specs2.concurrent.{ExecutionEnv => EE} 

"Foo" in { implicit ee: EE => // take care of ee 
    myAsyncFunWithFuture must beEqualTo(expectedVal).await(timeToWait) 
} 
+0

申し訳ありませんが、私はあなたの答えを理解していません。あなたはもっと説明できます – user4650183

+0

'.wait'ヘルパーで正しく終わる限り、Specs2を使ってテストするためにScala' Await'を使う必要はありません。これは 'map'ed valの場合とは異なります。 – cchantep

+0

Afaik、インポートExecutionEnv、暗黙的な – C4stor

0

@ user4650183あなたの質問を理解できないと思います。あなたが好きな場合は、使用前に結果を待つか、ブロックする必要があります。

関連する問題