effect can take callback when done