return results in a vector
separate emit() from results() to expose a future/promises like interface
add a synchronous caller