diff options
Diffstat (limited to 'ext/node/polyfills/_next_tick.ts')
-rw-r--r-- | ext/node/polyfills/_next_tick.ts | 145 |
1 files changed, 56 insertions, 89 deletions
diff --git a/ext/node/polyfills/_next_tick.ts b/ext/node/polyfills/_next_tick.ts index 7cbff0ea4..d5aa88218 100644 --- a/ext/node/polyfills/_next_tick.ts +++ b/ext/node/polyfills/_next_tick.ts @@ -1,8 +1,6 @@ // Copyright 2018-2023 the Deno authors. All rights reserved. MIT license. // Copyright Joyent, Inc. and other Node contributors. -// deno-lint-ignore-file no-inner-declarations - import { core } from "internal:deno_node/polyfills/_core.ts"; import { validateFunction } from "internal:deno_node/polyfills/internal/validators.mjs"; import { _exiting } from "internal:deno_node/polyfills/_process/exiting.ts"; @@ -15,9 +13,6 @@ interface Tock { const queue = new FixedQueue(); -// deno-lint-ignore no-explicit-any -let _nextTick: any; - export function processTicksAndRejections() { let tock; do { @@ -68,92 +63,21 @@ export function processTicksAndRejections() { // setHasRejectionToWarn(false); } -if (typeof core.setNextTickCallback !== "undefined") { - function runNextTicks() { - // FIXME(bartlomieju): Deno currently doesn't unhandled rejections - // if (!hasTickScheduled() && !hasRejectionToWarn()) - // runMicrotasks(); - // if (!hasTickScheduled() && !hasRejectionToWarn()) - // return; - if (!core.hasTickScheduled()) { - core.runMicrotasks(); - } - if (!core.hasTickScheduled()) { - return true; - } - - processTicksAndRejections(); - return true; - } - - core.setNextTickCallback(processTicksAndRejections); - core.setMacrotaskCallback(runNextTicks); - - function __nextTickNative<T extends Array<unknown>>( - this: unknown, - callback: (...args: T) => void, - ...args: T - ) { - validateFunction(callback, "callback"); - - if (_exiting) { - return; - } - - // TODO(bartlomieju): seems superfluous if we don't depend on `arguments` - let args_; - switch (args.length) { - case 0: - break; - case 1: - args_ = [args[0]]; - break; - case 2: - args_ = [args[0], args[1]]; - break; - case 3: - args_ = [args[0], args[1], args[2]]; - break; - default: - args_ = new Array(args.length); - for (let i = 0; i < args.length; i++) { - args_[i] = args[i]; - } - } - - if (queue.isEmpty()) { - core.setHasTickScheduled(true); - } - // FIXME(bartlomieju): Deno currently doesn't support async hooks - // const asyncId = newAsyncId(); - // const triggerAsyncId = getDefaultTriggerAsyncId(); - const tickObject = { - // FIXME(bartlomieju): Deno currently doesn't support async hooks - // [async_id_symbol]: asyncId, - // [trigger_async_id_symbol]: triggerAsyncId, - callback, - args: args_, - }; - // FIXME(bartlomieju): Deno currently doesn't support async hooks - // if (initHooksExist()) - // emitInit(asyncId, 'TickObject', triggerAsyncId, tickObject); - queue.push(tickObject); +export function runNextTicks() { + // FIXME(bartlomieju): Deno currently doesn't unhandled rejections + // if (!hasTickScheduled() && !hasRejectionToWarn()) + // runMicrotasks(); + // if (!hasTickScheduled() && !hasRejectionToWarn()) + // return; + if (!core.hasTickScheduled()) { + core.runMicrotasks(); } - _nextTick = __nextTickNative; -} else { - function __nextTickQueueMicrotask<T extends Array<unknown>>( - this: unknown, - callback: (...args: T) => void, - ...args: T - ) { - if (args) { - queueMicrotask(() => callback.call(this, ...args)); - } else { - queueMicrotask(callback); - } + if (!core.hasTickScheduled()) { + return true; } - _nextTick = __nextTickQueueMicrotask; + processTicksAndRejections(); + return true; } // `nextTick()` will not enqueue any callback when the process is about to @@ -169,5 +93,48 @@ export function nextTick<T extends Array<unknown>>( callback: (...args: T) => void, ...args: T ) { - _nextTick(callback, ...args); + validateFunction(callback, "callback"); + + if (_exiting) { + return; + } + + // TODO(bartlomieju): seems superfluous if we don't depend on `arguments` + let args_; + switch (args.length) { + case 0: + break; + case 1: + args_ = [args[0]]; + break; + case 2: + args_ = [args[0], args[1]]; + break; + case 3: + args_ = [args[0], args[1], args[2]]; + break; + default: + args_ = new Array(args.length); + for (let i = 0; i < args.length; i++) { + args_[i] = args[i]; + } + } + + if (queue.isEmpty()) { + core.setHasTickScheduled(true); + } + // FIXME(bartlomieju): Deno currently doesn't support async hooks + // const asyncId = newAsyncId(); + // const triggerAsyncId = getDefaultTriggerAsyncId(); + const tickObject = { + // FIXME(bartlomieju): Deno currently doesn't support async hooks + // [async_id_symbol]: asyncId, + // [trigger_async_id_symbol]: triggerAsyncId, + callback, + args: args_, + }; + // FIXME(bartlomieju): Deno currently doesn't support async hooks + // if (initHooksExist()) + // emitInit(asyncId, 'TickObject', triggerAsyncId, tickObject); + queue.push(tickObject); } |