SpecialPromise.ts 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. declare global {
  2. type PromiseExecutor<T> = (resolve: (value?: T | PromiseLike<T>) => void, reject: (reason?: any) => void) => void;
  3. type IPromiseFunc<T = any> = (executor: PromiseExecutor<T>) => Promise<T>;
  4. }
  5. /**
  6. * Resolved 的 Promise
  7. */
  8. export const PromiseResolved = Promise.resolve();
  9. /**
  10. * 在组件上挂载一个延迟的回调函数
  11. * @param seconds 延迟多少秒
  12. * @param comp 调度者
  13. * @param promise
  14. * @returns
  15. */
  16. export const PromiseSchedulerSeconds = (seconds: number, comp: cc.Component, promise: IPromiseFunc = PromiseDefault) => {
  17. return promise(resolve => {
  18. comp.scheduleOnce(resolve, seconds);
  19. });
  20. }
  21. /**
  22. * TimeOutPromise
  23. * @param seconds 延迟多少秒
  24. * @param comp 调度者
  25. * @param promise
  26. * @returns
  27. */
  28. export const PromiseTimeout = (seconds: number, func: (seconds) => void, promise: IPromiseFunc = PromiseDefault) => {
  29. return promise(resolve => {
  30. setTimeout(() => {
  31. func && func(seconds);
  32. resolve();
  33. }, seconds * 1000);
  34. });
  35. }
  36. /**
  37. * 默认的 Promise
  38. * @param executor
  39. * @returns
  40. */
  41. export function PromiseDefault<T = any>(executor: PromiseExecutor<T>): Promise<T> {
  42. return new Promise(executor);
  43. }
  44. /**
  45. * 下一帧 resolve
  46. */
  47. export function NextFrameResolvePromise(comp: cc.Component, curFrameFunc: () => void) {
  48. curFrameFunc();
  49. return new Promise(resolve => comp.scheduleOnce(resolve, 0))
  50. }
  51. /** 返回一个 interval 检测的 Promise */
  52. export function IntervalCheckPromise(check: () => boolean, interval: number = 0.1) {
  53. return new Promise<void>(rs => {
  54. let timer;
  55. timer = setInterval(() => {
  56. if (check()) {
  57. clearInterval(timer);
  58. timer = null;
  59. rs();
  60. }
  61. }, interval * 1000);
  62. });
  63. }