Y a-t-il un moyen de fixer une montre sur un avenir afin qu'il déclenche un rappel lorsqu'il est fait?
Quelque chose comme ça? p>
> (def a (future (Thread/sleep 1000) "Hello World!") > (when-done a (println @a)) ...waits for 1sec... ;; => "Hello World"
5 Réponses :
Vous pouvez commencer une autre tâche qui surveille l'avenir puis exécute la fonction. Dans ce cas, je vais simplement utiliser un autre avenir. Qui est bien entendu dans une fonction réalisée:
J'ai trouvé ce fil sur Google qui a l'air intéressant: p>
https://groups.google.com/forum /? Fromgroups = #! Sujet / CLOJURE-DEV / 7BKQI9NNWWWW P>
http://dev.clojure.org/display/design/promise < / p>
https://github.com/stuarttsierra/cljque/ blob / maître / src / cljque / prometx.clj p>
Pour des cas très simples: Si vous ne voulez pas bloquer et ne vous souciez pas du résultat, ajoutez simplement le rappel de la définition future.
final MyCallBack callbackObj = new MyCallBack();
new Thread() {
public void run() {
a-taking-time-computation();
callbackObj.call();
}
}.start()
au lieu d'ajouter du temps supplémentaire avec thread / dormir code>, je tire parti du fait que @ futur-ref code> pour toute référence à l'avenir attendra jusqu'au futur. est fait. (defn wait-for
[futures-to-complete]
(every? #(@%) futures-to-complete))
# (@%) code> peut être modifié en DEREF code>. @ code> est juste du sucre syntaxique pour la fonction DEREF code>.
une extension à la réponse acceptée
Veuillez noter la réserve suivante: p>
avec le ne sera pas imprimé car l'appel DEREF sur l'annulation
L'avenir posera une exception. P> Si vous avez besoin de rappels pour arriver, je vous suggère: P> ci-dessus lors de la mise en œuvre code> Le rappel ne sera pas invoqué
Si l'avenir est annulé.
Qui est p> (do
(def f0 (future (Thread/sleep 1000)))
(then f0 (fn
([] (println "CANCELLED"))
([e] (println "THEN=>" e))))
(Thread/sleep 500)
(future-cancel f0))
(printLn @a)) par lui-même bloque déjà en attente de la finition avant d'exécuter PrintLN. Que vouliez-vous de plus?
En outre, ce que vous pouvez réellement vouloir, c'est
notificationsvice code>