3

ユースケースは実際にはかなり典型的です。多くの Web サービスは、セッションの開始時に取得した認証トークンを使用し、後続の要求でそれらを送り返す必要があります。

私は次のようにできることを知っています:

lazy val myData = {    
    val request = ws.url("/some/url").withAuth(user, password, WSAuthScheme.BASIC).withHeaders("Accept" -> "application/json")
    Await.result(request.get().map{x => x.json }, 120.seconds)
}

すべてのドキュメントが決して私たちを待っていないと言っているので、それは間違っているように感じます.

これを処理する Future/Promise Scala スタイルの方法はありますか?

.onCompletePromise の完了時にコードを実行できることを発見しましたが、(変更可能な) a を使用しvarないと、そのスコープの値を別のスコープの a に取得する方法がわかりませんlazy val。を使用しても、varタイミングの問題が発生する可能性があります-したがって、可変変数の悪:)

これを行う他の方法はありますか?

4

1 に答える 1

0

残念ながら、これを非ブロッキングにする方法はありません。s はlazy val同期的であり、値で完了するまでアクセスするスレッドをブロックするように設計されています (内部的に alazy valは単純なsynchronizedブロックとして表されます)。

Future/PromiseScala では a の代わりに a または a を使用しますが、Future[T]その方法では val を使用するたびにs とsで大量のオーバーヘッドが発生することを意味し、すべての場合において、より最適なリソース使用率が読みやすさの低下に見合うとは限りません。そのため、アプリケーションの多くの部分で値を広範囲に使用する場合は、そのままにしておいても問題ありません。Promise[T]val x: TexecutionContextmapAwait

于 2016-06-03T16:17:55.470 に答える