only use setTimeout if necessary