use recursive nextTick instead of setInterval