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
相关产品推荐
相关产品推荐

