Node.js v11.0.0 から queueMicrotask というメソッドが Global Objects に生えてました

:memo: queueMicrotask

Stability: 1 - Experimental

たまたま doc を見ていたらたまたま見つけたのでたまたま調べてみました。

その名の通り、microtask に 関数を enqueue できるようになる メソッドらしいです。

Node.js は v.11.0.0 から試せます。

$ node -v; node --no-warnings
v11.0.0
> queueMicrotask
[Function: queueMicrotask]
>

一応 chrome にも実装されているっぽい https://www.chromestatus.com/feature/5111086432911360

この issue が proposal っぽい?

要すると、今まで microTask で cb を実行させるには Promise なり MutationObserver|process.nextTick でラップする必要があって分かりにくいやーんって感じなのかな

さっと確認用の script を書いたので event loop に自信ニキは結果を予想してみてください

console.log("start:main");

const syncFn = v => () => {
  console.log(v);
};

setImmediate(syncFn("imidiate"));
setTimeout(syncFn("setTimeout"));

queueMicrotask(syncFn("qmt"));
Promise.resolve().then(syncFn("resolve"));
process.nextTick(syncFn("nt"));

queueMicrotask(() => queueMicrotask(syncFn("qmt:r")));
Promise.resolve().then(() => Promise.resolve().then(syncFn("resolve:r")));
process.nextTick(() => process.nextTick(syncFn("nt:r")));

Promise.resolve().then(syncFn("resolve2"));
queueMicrotask(syncFn("qmt2"));
process.nextTick(syncFn("nt2"));

console.log("end:main");

結果はこんな感じです

$  node --no-warnings sample.js
start:main
end:main
nt
nt2
nt:r
qmt
resolve
resolve2
qmt2
qmt:r
resolve:r
setTimeout
imidiate

The microtask queue is managed by V8 and may be used in a similar manner to the process.nextTick() queue, which is managed by Node.js. The process.nextTick() queue is always processed before the microtask queue within each turn of the Node.js event loop.

とあるので、Promise.resolve().then(cb) としてたとこの代替っぽく使えそう。

明示的な API でワイ的には結構すこなので Stable までいってほしいところ。

fin.