future can be null, directly pass the handler