V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
superhot
V2EX  ›  JavaScript

分享一道 Node.js 的面试题,考察 JS 相关的最基本的掌握程度,代码完全来自官方文档

  •  
  •   superhot · 4 小时 8 分钟前 · 590 次点击

    简述以下代码的输出结果,并解释执行过程:

    import { once, EventEmitter } from 'node:events';
    import process from 'node:process';
    
    const ee = new EventEmitter();
    
    process.nextTick(() => {
      ee.emit('myevent', 42);
    });
    
    const [value] = await once(ee, 'myevent');
    console.log(value);
    
    const err = new Error('kaboom');
    process.nextTick(() => {
      ee.emit('error', err);
    });
    
    try {
      await once(ee, 'myevent');
    } catch (err) {
      console.error('error happened', err);
    }
    

    以上代码来自这里

    里面涉及到的基础知识点有:

    1. Promise
    2. async/await
    3. Node.js 中的微任务队列与 nexttick 队列
    4. CJS 与 MJS 的差异
    5. Node.js 中的 EventEmitter

    最后,这真的不算八股,AI 当然可以解释清楚,但这么一段简单清晰的代码,你还不知所以然的话,那对着 Vibe Coding 出来的屎山,最后只能束手无策了。

    11 条回复    2026-01-15 20:12:09 +08:00
    Zhuzhuchenyan
        1
    Zhuzhuchenyan  
       3 小时 49 分钟前   ❤️ 1
    哈哈,这不是几年前我校招的时候面试官最“喜欢”的面试题嘛

    看我随手出一道,console.log 1234 才是味道最足的

    console.log(1);
    setTimeout(() => console.log(2), 0);
    process.nextTick(() => {
    console.log(3);
    queueMicrotask(() => console.log(4));
    });

    queueMicrotask(() => {
    console.log(5);
    process.nextTick(() => console.log(6));
    });
    new Promise(resolve => {
    console.log(7);
    resolve();
    console.log(8);
    }).then(() => {
    console.log(9);
    process.nextTick(() => console.log(10));
    queueMicrotask(() => console.log(11));
    });

    new Promise(resolve => {
    console.log(12);
    setTimeout(() => {
    console.log(13);
    resolve();
    }, 0);
    }).then(() => {
    console.log(14);
    });

    (async () => {
    console.log(15);
    await void 0;
    console.log(16);
    process.nextTick(() => console.log(17));
    queueMicrotask(() => console.log(18));
    })();

    console.log(19);
    craftsmanship
        2
    craftsmanship  
       3 小时 48 分钟前 via Android
    @Zhuzhuchenyan 🆘啊
    lqm
        3
    lqm  
       3 小时 44 分钟前
    AI 既然清清楚楚,那怎么会堆出类似错误的屎山
    tearnarry
        4
    tearnarry  
       3 小时 39 分钟前
    既然 AI 可以解释清楚
    1. 不会 Vibe Coding 出来屎山
    2. 如果有 Vibe Coding 出来的屎山,继续让 AI 修复即可
    4seasons
        5
    4seasons  
       3 小时 35 分钟前
    @Zhuzhuchenyan 这个玩意儿我寻思着真的有人能分析出来吗?
    lanced
        6
    lanced  
       2 小时 16 分钟前
    @Zhuzhuchenyan 太经典了
    wuxilaoshiren
        7
    wuxilaoshiren  
       2 小时 13 分钟前
    典典典 前些年面试就喜欢问这个
    但是随着 AI 的到来,感觉看这些都没意义了
    ssssiiiirren
        8
    ssssiiiirren  
       2 小时 13 分钟前
    哥们你这题目出的有问题,你这程序但凡要能运行的下去,就必须先打印 42 ,然后后面就能推出来了。
    如果不先打印 42 ,await 那里就卡住了。
    chenluo0429
        9
    chenluo0429  
       1 小时 48 分钟前 via Android
    我面试的时候从来不会问这些。一个合格的开发应当知道一些会引发典型的回调/异步等时序难以确定的场景,然后在正常的开发过程中,别这么用他们
    Ketteiron
        10
    Ketteiron  
       1 小时 31 分钟前
    我说个暴论,凡是用得上 EventEmitter 的项目,99%是屎山
    SanjinGG
        11
    SanjinGG  
       57 分钟前
    能出现这种代码的公司还有必要去?
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   3278 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 13:09 · PVG 21:09 · LAX 05:09 · JFK 08:09
    ♥ Do have faith in what you're doing.