You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js问题:Q库denodeify未调用then、fail或fin中的函数?

问题分析与解决方案

嘿,我一眼就看出问题出在哪啦!你的代码核心错误是对q.denodeify的用法理解偏差,咱们一步步理清楚:

错误根源

q.denodeify的作用是把遵循(err, result)回调风格的函数,转换成返回Promise的函数。转换后的函数不需要再传入回调参数,你现在给add_promise传了function() {console.log("i am cb")},直接打乱了Promise的执行逻辑——此时返回的不是Promise对象,自然不会触发then/fail/fin里的回调。

修正后的代码

var q = require('q');
function Add(cb) {
    var a,b,c;
    a = 5;
    b = 6;
    c = a + b;
    console.log("inside");
    cb(null, 123);
}
var add_promise = q.denodeify(Add);
// 这里直接调用add_promise,不用传回调!
add_promise()
  .then(function(res){ console.log("ok, result is: " + res); })
  .fail(function(err){ console.log("error: " + err); })
  .fin(function() { console.log("final"); });
console.log("outside");

预期执行结果

运行修正后的代码,你会看到输出顺序如下,所有Promise链上的回调都能正常触发:

outside
inside
ok, result is: 123
final

额外小提示

如果你的Node.js版本在v8及以上,其实可以不用Q库,直接用原生的util.promisify实现同样的功能,用法和denodeify几乎一致:

const util = require('util');
const add_promise = util.promisify(Add);
// 后续调用逻辑和上面完全一致

内容的提问来源于stack exchange,提问作者Herman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:22:53