We can use the wiretap method of the Promise interface to listen in on results. We write an Action implementation which has the result of a Promise encapsulated in a Result object. The wiretap method can be used to do something with a Promise value without interrupting a method chain.

In the following example we tap in on Promise results:

import com.mrhaki.ratpack.Book
import com.mrhaki.ratpack.BookService
import com.mrhaki.ratpack.DefaultBookService
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import ratpack.exec.Result
import ratpack.jackson.Jackson

import static ratpack.groovy.Groovy.ratpack

final Logger logger = LoggerFactory.getLogger(ratpack.class)

ratpack {

    bindings {
        bind(BookService, DefaultBookService)
    }

    handlers { BookService bookService ->
         get('book/:isbn') {
            final String isbn = pathTokens.isbn
            bookService
                    .findBook(isbn)
                    .wiretap { Result result ->
                        logger.debug 'Book {}', result.value
                    }
                    .map({ Book book ->
                        \[author: book.author, title: book.title\]
                    })
                    .wiretap({ Result\> result ->
                        logger.debug 'Book as map {}', result.value
                    })
                    .map(Jackson.&json)
                    .then { bookAsJson ->
                        render(bookAsJson)
                    }
        }
    }
} 

Written with Ratpack 1.1.1.

Original blog post

shadow-left