( obj: any, funcName: string, metaCreator: (self: any, args: any[]) => MacroTaskMeta, )
| 469 | |
| 470 | // TODO: @JiaLiPassion, support cancel task later if necessary |
| 471 | export function patchMacroTask( |
| 472 | obj: any, |
| 473 | funcName: string, |
| 474 | metaCreator: (self: any, args: any[]) => MacroTaskMeta, |
| 475 | ) { |
| 476 | let setNative: Function | null = null; |
| 477 | |
| 478 | function scheduleTask(task: Task) { |
| 479 | const data = <MacroTaskMeta>task.data; |
| 480 | data.args[data.cbIdx] = function () { |
| 481 | task.invoke.apply(this, arguments); |
| 482 | }; |
| 483 | setNative!.apply(data.target, data.args); |
| 484 | return task; |
| 485 | } |
| 486 | |
| 487 | setNative = patchMethod( |
| 488 | obj, |
| 489 | funcName, |
| 490 | (delegate: Function) => |
| 491 | function (self: any, args: any[]) { |
| 492 | const meta = metaCreator(self, args); |
| 493 | if (meta.cbIdx >= 0 && typeof args[meta.cbIdx] === 'function') { |
| 494 | return scheduleMacroTaskWithCurrentZone(meta.name, args[meta.cbIdx], meta, scheduleTask); |
| 495 | } else { |
| 496 | // cause an error by calling it directly. |
| 497 | return delegate.apply(self, args); |
| 498 | } |
| 499 | }, |
| 500 | ); |
| 501 | } |
| 502 | |
| 503 | export interface MicroTaskMeta extends TaskData { |
| 504 | name: string; |
no test coverage detected
searching dependent graphs…