我正在尝试用节点学习“q”库。
$ node -v // -> v0.6.6
我现在正在使用https://github.com/kriskowal/q/blob/master/q.js中的最新q.js
。我将代码复制到q.js
文件中,该文件是我testq.js
文件的兄弟。
testq.js
的代码是:
function step1(callback) { console.log("step1"); callback("abc"); };
var Q = require("./q");
Q.fcall(step1).end();
当我运行它时:
node testq.js
报道:
E:\WORKSPACE_NODE\TestNodeJs\q>node testq.js
step1
node.js:201
throw e; // process.nextTick error, or 'error' event on first tick
^
TypeError: undefined is not a function
at step1 (E:\WORKSPACE_NODE\TestNodeJs\q\testq.js:1:112)
at makePromise.<anonymous> (E:\WORKSPACE_NODE\TestNodeJs\q\q.js:541:27)
at makePromise.promiseSend (E:\WORKSPACE_NODE\TestNodeJs\q\q.js:325:41)
at Array.0 (E:\WORKSPACE_NODE\TestNodeJs\q\q.js:787:28)
at EventEmitter._tickCallback (node.js:192:40)
我安装了v8 debugger plugin for eclipse,逐行调试。不幸的是,我找不到错误的开始。
我是nodejs的新手,请帮我调试。例如。我应该使用什么工具?或者我应该尝试任何其他有用的方法?
更新
Per Hogan的答案,代码:
function step1(callback) { console.log("step1"); };
var Q = require("./q");
Q.fcall(step1).end();
可以成功运行而不会出现任何错误。
但是当我尝试时:
function step1(callback) { console.log("step1"); };
var Q = require("./q");
Q.fcall(step1)
.then(function(v) {
console.log("finished: " +v);
}, function(err){
console.log(err);
})
.end();
打印:
E:\WORKSPACE_NODE\TestNodeJs\q>node testq.js
step1
finished: undefined
我仍然想要一个step1
会将某些内容传递给function(v) {console.log("finished: " +v);}
的演示,其中v
不是undefined
。
答案 0 :(得分:1)
让你的step1看起来像这样(修改为最后一个版本):
function step1() { console.log("step1"); return "abc" };
然后你会很开心。
查看Q文档,我相信你想要'Q.node(...)或Q.ncall(...)或Q.fcall(...)
我会更多地阅读关于Q的内容,或者如果您描述了您想要做的事情,我可能会提供帮助。
step1接受一个参数 - 一个函数。
但是当你调用它时没有定义它,因此callback("abc");
未定义。
当你摆脱所有无关紧要的东西时,也许更清楚:
function step1(callback) { console.log("step1"); callback("abc"); };
var Q = require("q");
Q.call(step1)
答案 1 :(得分:1)
Q文档在这一点上不是很清楚 - Q.call/Q.fcall/Q.ncall做的是采用同步函数(即返回值的函数)并转向它成了一个承诺。
在文档中有这样的情况:
function step1 () {
var result = 10;
console.log('step1');
callback(result);
}
function step2 (result) {
result += 5;
console.log('step2');
callback(result);
}
step1 ( function(result) {
step2 (result, function(result) {
result += 5;
console.log(result);
});
});
然后文档说您可以像这样转换它以获得相同的结果
(***)
Q.fcall(step1)
.then(step2)
.then( function(result) {
result += 5;
console.log(result);
}).end();
我发现这里令人困惑的是两个'step1'和'step2'函数不一样:他在'promisified'版本中使用的'step1'和'step2'看起来真的像这样:
function step1 () {
var result = 10;
console.log('step1');
return result;
}
function step2 (result) {
result += 5;
console.log('step2');
return result;
}
使用步骤1和步骤2的这些同步版本,您会看到上面的( * )现在可以正常工作
所有这一切都很有趣(对我来说)的原因是你可以使用相同的配方来做到这一点
function step1 () {
var result = 10;
var deferred = Q.defer();
console.log('step1');
setTimeout(deferred.resolve, 2000, result);
return deferred.promise;
}
function step2 (result) {
result += 5;
console.log('step2');
return result;
}
Q.fcall(step1)
.then(step2)
.then(function(result) {
result += 5;
console.log(result);
}).end();
答案 2 :(得分:0)
您需要使用fcall而不是通话。 call
是一个保留的javascript函数。