From ee6c467c8a7b451b4d785f0068f4e130de48ecc1 Mon Sep 17 00:00:00 2001 From: James M Snell Date: Mon, 22 Feb 2021 15:03:09 -0800 Subject: [PATCH] doc: recommend queueMicrotask over process.nextTick We likely cannot ever deprecate process.nextTick, but we can start steering people towards queueMicrotask for most cases. Signed-off-by: James M Snell Fixes: https://github.com/nodejs/node/issues/36870 PR-URL: https://github.com/nodejs/node/pull/37484 Reviewed-By: Gus Caplan Reviewed-By: Robert Nagy --- doc/api/process.md | 65 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/doc/api/process.md b/doc/api/process.md index 5e798af0bb6cc4..938f348b21959b 100644 --- a/doc/api/process.md +++ b/doc/api/process.md @@ -1730,6 +1730,70 @@ function definitelyAsync(arg, cb) { } ``` +### When to use `queueMicrotask()` vs. `process.nextTick()` + +The [`queueMicrotask()`][] API is an alternative to `process.nextTick()` that +also defers execution of a function using the same microtask queue used to +execute the then, catch, and finally handlers of resolved promises. Within +Node.js, every time the "next tick queue" is drained, the microtask queue +is drained immediately after. + +```js +Promise.resolve().then(() => console.log(2)); +queueMicrotask(() => console.log(3)); +process.nextTick(() => console.log(1)); +// Output: +// 1 +// 2 +// 3 +``` + +For *most* userland use cases, the `queueMicrotask()` API provides a portable +and reliable mechanism for deferring execution that works across multiple +JavaScript platform environments and should be favored over `process.nextTick()`. +In simple scenarios, `queueMicrotask()` can be a drop-in replacement for +`process.nextTick()`. + +```js +console.log('start'); +queueMicrotask(() => { + console.log('microtask callback'); +}); +console.log('scheduled'); +// Output: +// start +// scheduled +// microtask callback +``` + +One note-worthy difference between the two APIs is that `process.nextTick()` +allows specifying additional values that will be passed as arguments to the +deferred function when it is called. Achieving the same result with +`queueMicrotask()` requires using either a closure or a bound function: + +```js +function deferred(a, b) { + console.log('microtask', a + b); +} + +console.log('start'); +queueMicrotask(deferred.bind(undefined, 1, 2)); +console.log('scheduled'); +// Output: +// start +// scheduled +// microtask 3 +``` + +There are minor differences in the way errors raised from within the next tick +queue and microtask queue are handled. Errors thrown within a queued microtask +callback should be handled within the queued callback when possible. If they are +not, the `process.on('uncaughtException')` event handler can be used to capture +and handle the errors. + +When in doubt, unless the specific capabilities of `process.nextTick()` are +needed, use `queueMicrotask()`. + ## `process.noDeprecation`