为什么util.promisify不需要传入回调函数调用后的返回值?
核心原因是util.promisify的输入要求是「函数本身」,而不是函数执行后的返回值
util.promisify是Node.js内置的函数转换器,作用是把符合错误优先回调风格的原始函数,包装成一个返回Promise的新函数,因此它的第一个入参必须是一个函数类型的值。
如果你写成promisify(opA())会触发两类错误:
- 直接执行
opA()会立刻触发报错
你写opA()就会立即调用这个函数,但此时你没有传入它要求的回调参数cb,等定时器到点执行cb(null, 'A')时,就会直接抛出TypeError: cb is not a function的错误。 - 传给
promisify的参数不符合要求
就算你强行给opA传入了一个临时回调避免第一个错误,opA本身也没有定义返回值,执行后默认返回undefined,promisify接收到非函数类型的入参时,会直接抛出类型校验错误:TypeError [ERR_INVALID_ARG_TYPE]: The "original" argument must be of type function. Received undefined,代码根本无法继续运行。
正确写法的执行逻辑:
你把opA这个函数本身传入promisify,得到的返回值a是一个新的包装函数:
- 当你调用
a()时,promisify内部会自动给原始的opA传入封装好的回调函数 - 回调触发时会自动把结果转为Promise的resolve/reject状态,这样才能用await拿到返回的'A'/'B'/'C',也能捕获回调里抛出的错误。
内容的提问来源于stack exchange,提问作者Sandra Schlichting
相关产品推荐
相关产品推荐

