2017-10-07 10 views
1

Est-il possible de dormir dans un avenir dans Scala.js?Dormir dans Future dans Scala.js

Quelque chose comme:

Future { 
    Thread.sleep(1000) 
    println("ready") 
} 

Si j'essaie cela, alors je reçois une méthode exception disant que sleep n'existe pas.

Il semble qu'il est possible de dormir dans JS: What is the JavaScript version of sleep()? même s'il n'est pas possible de bloquer.

+0

Il suffit d'utiliser 'pausecomp' de la solution liée :) (Je suppose que vous êtes pleinement conscient de la raison pour laquelle vous ne voudriez pas le faire la plupart du temps). – gzm0

+0

Je pense que la réponse donnée ci-dessous est parfaitement bien et il n'y a aucune raison que quelqu'un ne l'utilise pas à chaque fois qu'il souhaite retarder un futur. – jhegedus

Répondre

3

Vous ne pouvez pas vraiment faire une pause au milieu du corps futur, mais vous pouvez enregistrer votre avenir en tant que suivi d'un avenir « retard », que vous pouvez définir comme:

def delay(milliseconds: Int): Future[Unit] = { 
    val p = Promise[Unit]() 
    js.timers.setTimeout(milliseconds) { 
    p.success(()) 
    } 
    p.future 
} 

et que vous pouvez ensuite utiliser comme:

val readyLater = for { 
    delayed <- delay(1000) 
} yield { 
    println("ready") 
} 
+0

merci beaucoup! très agréable ! – jhegedus

+0

Selon que vous voulez réellement dormir pendant une période de temps spécifique ou que vous voulez que quelque chose se passe "plus tard" (ce qui est souvent nécessaire pour tester), notez la fonction notYet dans la bibliothèque jsExt, qui en fait une version plus lâche: https : //github.com/jducoeur/jsext –

+0

Hm ... Je ne comprends pas vraiment ce que tu veux dire ... plus tard? qui décide ce qui est plus tard? plus tard à l'égard de quoi? Avez-vous un exemple ? – jhegedus