once should not throw away cancel function