手动将函数插入Javascript/Nodejs事件队列?



例如,如果我想这样做

function doA(callback) {
console.log("Do A")
callback()
}
function doB() {
console.log("Do B")
}
function doC() {
console.log("Do C")
}
doA(doC)
doB()

我想要输出

Do A
Do B
Do C

但是,获得此结果的唯一方法是使用此技巧将项目推送到队列:

setTimeout(() => {
doTask();
}, 0);

有没有办法手动将项目添加到javscript/nodejs事件队列中?我问这个更多的是为了理论练习,而不是任何实际的编程需求。如果不首先调用已经异步的内置函数,似乎无法执行任何异步任务。

setTimeout工作正常,我不认为这是一个黑客。但也有一个queueMicrotask,这听起来可能更适合你的目的 - 它会对一个微任务进行排队,一旦所有其他同步Javascript完成执行,该微任务就会运行:

function doA(callback) {
console.log("Do A")
queueMicrotask(callback);
}
function doB() {
console.log("Do B")
}
function doC() {
console.log("Do C")
}
doA(doC)
doB()

基本上等同于Promise.resolve().then(callback)

请注意,即时setTimeout宏任务排队(一旦事件循环开始处理下一条消息,该任务将运行,这可能需要几毫秒( - 相比之下,queueMicrotaskPromise.resolve.then将微任务排队,该微任务基本上将在其他同步JS完成后立即运行。

另请记住,queueMicrotask虽然在 Node 中受支持,但在浏览器中尚未得到广泛支持,因此如果您想在面向公众的网站上使用它,请确保包含 polyfill(或使用Promise.resolve方法(。

最新更新