Qual è la migliore pratica per le API asincrone che restituiscono futures su Scala?

3

Ho avviato un progetto per scrivere un driver PostgreSQL asincrono su Scala e per essere asincrono, ho bisogno di accettare i callback e usa i futures, ma accettare un callback e un futuro rende il codice ingombrante perché devi sempre inviare una richiamata anche se è inutile.

Ecco un test:

"insert a row in the database" in {

  withHandler {
    (handler, future) =>
      future.get(5, TimeUnit.SECONDS)
      handler.sendQuery( this.create ){ query =>  }.get( 5, TimeUnit.SECONDS )
      handler.sendQuery( this.insert ){ query =>  }.get( 5, TimeUnit.SECONDS ).rowsAffected === 1
  }

}

L'invio del callback vuoto è orribile, ma non sono riuscito a trovare un modo per renderlo opzionale o qualcosa del genere, quindi al momento non ho molte idee su come dovrebbe essere questa API esterna.

Potrebbe essere qualcosa di simile:

handler.sendQuery( this.create ).addListener { query => println(query) }

Ma poi di nuovo, non sono sicuro di come le persone stiano organizzando le API in questo senso. Fornire esempi anche in altri progetti sarebbe fantastico.

    
posta Maurício Linhares 10.03.2012 - 13:26
fonte

2 risposte

3

Se stai parlando async e futures in Scala, è imperativo leggere SIP-14 : Futures e promesse . Ci sono state anche ampie discussioni a riguardo sulla mailing list SIP, che è un gruppo google, quindi puoi trovare i suoi archivi.

    
risposta data 10.03.2012 - 22:16
fonte
2

No, devi solo usare i futures e non chiamare get su di essi a meno che non sia assolutamente necessario . Invece, aggiungi i callback ai future e trasformi e componi i future con i combinatori. Vedi Future di Twitter Util e futures Akka .

    
risposta data 10.03.2012 - 19:47
fonte

Leggi altre domande sui tag