0
votes

Comment passer le contexte d'exécution pour la compréhension sans utiliser implicite dans Scala?

J'ai un code qui utilise la compréhension pour exécuter la requête de base de données: xxx

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.
Quelle est la voie?

édité: xxx

totalfeenoceamountfromdb et listofrestreditfundfundfromdb < / code> sont les deux types futurs déjà initiés.

Y a-t-il un moyen de passer ici <- (?: exécutionContext) ?


4 commentaires

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) 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.


3 Réponses :


3
votes

Vous pouvez réécrire xxx pré>

comme p> xxx pré>

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)


7 commentaires

@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 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 , 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


@ 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 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)


@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 pour la compréhension . Vous avez quelques alternatives: 1. Utilisation de Flatmap à 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 dans sa réponse) qui développera pour {A <- (CE) FA; B <- (EC1) FB} Rendement (A, B) dans fa.flatmap (a => fb.map (B => (A, B)) (EC1) (EC1) < / code> Mais ce serait une overkill. Ce plugin devra modifier analyser de la phase car pour {A <- (CE) fa ... n'est pas parsable maintenant ("meilleur-monadique-for" Ne modifie pas analyseur ).



6
votes

Peut-être considérer peut-être scala-async qui a gagné Support de compilateur expérimental -XASYNC code> dans SCALA 2.13.3 où la compréhension suivante xxx pré>

peut être réécrit comme p> xxx pré>

où nous pouvons passer dans le contexte d'exécution EC code> explicitement sans recourir à plat /map.

l 'option de hacky utile pourrait être Better-MONADIC-FOR qui prend en charge la définition des implications à l'intérieur des compréhensions P>
val ec: ExecutionContext = ???
(for {
  implicit0(ec: ExecutionContext) <- Future.successful(ec)
  a <- Future(41)(ec)
  b <- Future(1)(ec)
} yield {
  a + b
})(ec)


3 commentaires

pour {A <- (?: exécutionContexx) futur (41) (EC) B <- (?: ExecutionContex) Future (1) (CE) (EC)} Rendement {A + B} Je veux passer Dans ce <- (?: exécutionContexx)


Dans ce cas, j'aurai besoin de "Scala-async" lib. Je vous vote. Mais existe-t-il un moyen dans pour la compréhension ?


@MHJ Je crois pas, voir Stackoverflow.com/a/21256762/5205022



2
votes

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)
}


0 commentaires