JavaScript
Node.js

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

:pencil: 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 に自信ニキは結果を予想してみてください


sample.js

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.