J'ai un code qui utilise la compréhension pour exécuter la requête de base de données: Nous savons pour la compréhension de la course à laquelle nous devons passer un contexte d'exécution implicite.
Mais dans ce cas, je veux passer le contexte d'exécution manuellement. Y a-t-il un moyen de passer ici
Quelle est la voie? P> totalfeenoceamountfromdb code> et
listofrestreditfundfundfromdb < / code> sont les deux types futurs déjà initiés. P>
<- (?: exécutionContext) code>? p> p>
3 Réponses :
Vous pouvez réécrire comme p> par exemple si totalfeenoceamountfromdb code> et
listofrestreditfundfundfromdb sont
futur code> s puis que vous puissiez passer implicite
scala.concurrent.executionContext.implicits.global code> explicitement p>
val res = totalFeeNoticeAmountFromDB.flatMap(totalFeeNoticeAmount =>
listOfRestrictedFundFromDB.map(listOfRestrictedFund =>
(totalFeeNoticeAmount, listOfRestrictedFund)
)(scala.concurrent.ExecutionContext.Implicits.global)
)(scala.concurrent.ExecutionContext.Implicits.global)
@MHJ pour la comprensement est toujours séquentiel non parallèle.
@MHJ non, peu importe si cela dépend de la précédente ou non. Il est toujours séquentiel car pour la compréhension ne fait que la syntaxe de sucre pour platmap code> donc c'est le même code. Vous pouvez le faire courir comme en parallèle si vous définissez les contrats à terme avant avant le
pour code>, car les contrats à terme sont impatients, ils seront exécutés avant de les séquencer, mais c'est en fait un bug et non une fonctionnalité. Quoi qu'il en soit, vous pouvez faire exactement la même chose avec
platmap code>
@ Luismiguelmejíasuárez, oui vous avez raison. Chose est que si nous initions l'avenir avant de faire appel à la compréhension, des choses parallèles se produisent avant de venir à la compréhension
@MHJ Oui et je vous dis que vous pouvez faire exactement la même chose en utilisant platmap code> afin de résoudre votre problème.
@ Luismiguelmejíasuárez, oui par Flatmap, je peux résoudre de cette façon et en parallèle si j'approuve les contrats à terme avant de venir à la page de route. Mon problème utilisait explicite exécutionContext dans <- (?: ExécutionContext) code>
@Mhj ok alors laissez-moi mettre ce simple. Il n'y a aucun moyen de passer explicitement le contexte d'exécution utilisé dans un futur b> pour la compréhension code>. Vous avez quelques alternatives: 1. Utilisation de
Flatmap CODE> à la place afin que vous puissiez définir les CE utilisés dans toutes les opérations. - 2. Encapsolez tout cela sur sa propre fonction, vous pouvez donc transmettre la CE pour toute la fonction.
@MHJ Eh bien, vous pouvez créer votre propre plug-in compilateur (comme "Better-Monadic-for" Plugin mentionné par Mario Galic B> dans sa réponse) qui développera pour {A <- (CE) FA; B <- (EC1) FB} Rendement (A, B) Code> dans
fa.flatmap (a => fb.map (B => (A, B)) (EC1) (EC1) < / code> Mais ce serait une overkill. Ce plugin devra modifier
analyser code> de la phase code> car
pour {A <- (CE) fa ... code> n'est pas parsable maintenant ("meilleur-monadique-for" Ne modifie pas
analyseur code>).
Peut-être considérer peut-être scala-async qui a gagné Support de compilateur expérimental peut être réécrit comme p> où nous pouvons passer dans le contexte d'exécution -XASYNC code> dans SCALA 2.13.3 où la compréhension suivante
EC code> explicitement sans recourir à plat /map.
val ec: ExecutionContext = ???
(for {
implicit0(ec: ExecutionContext) <- Future.successful(ec)
a <- Future(41)(ec)
b <- Future(1)(ec)
} yield {
a + b
})(ec)
pour {A <- (?: exécutionContexx) futur (41) (EC) B <- (?: ExecutionContex) Future (1) (CE) (EC)} Rendement {A + B} Code> Je veux passer Dans ce
<- (?: exécutionContexx) code>
Dans ce cas, j'aurai besoin de "Scala-async" lib. Je vous vote. Mais existe-t-il un moyen dans pour la compréhension code>?
@MHJ Je crois pas, voir Stackoverflow.com/a/21256762/5205022
Je pense que la solution la plus simple à ce problème est simplement de créer une fonction auxiliaire.
def foo(implicit ec: ExecutionContext): Future[(Int, Int)] = { val totalFeeNoticeAmountFromDB = Future(/..Doing db job../) val listOfRestrictedFundFromDB = Future(/..Doing db job../) for { totalFeeNoticeAmount <- totalFeeNoticeAmountFromDB listOfRestrictedFund <- listOfRestrictedFundFromDB } yield (totalFeeNoticeAmount, listOfRestrictedFund) }
Toute argument implicite peut être transmise explicitement comme un argument clair, mais s'il existe plusieurs arguments implicites pour le même appel, tous ces arguments doivent être adoptés explicitement.
@cchantep, je sais ça. J'ai édité ma question. En fait, je veux passer un contexte d'exécution dans ce
<- (?: ExécutionContext) code> Partie explicitement.
Je crois que la manière la plus simple serait de créer un nouveau bloc ou une nouvelle fonction pour cette partie et définir un nouveau contexte d'exécution implicite pour ce bloc.
Une autre alternative simple, étant donné que vos contrats à terme ne dépendent pas les uns sur les autres pour les créer avec les CE explicites que vous souhaitez, puis les composer.