mandatory callbacks for .async(), optional for .run()