2

我正在尝试学习带有节点的“q”库。

$ node -v // -> v0.6.6

我现在正在使用q.js来自https://github.com/kriskowal/q/blob/master/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)

为 eclipse 安装了 v8 调试器插件,逐行调试。不幸的是,我找不到错误开始。

我是nodejs的新手,请帮我调试。例如,我应该使用什么工具?或者我应该尝试任何其他有用的方法?


更新

根据霍根的回答,代码:

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.

4

3 回答 3

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)
于 2012-05-02T15:39:21.110 回答
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;
}

使用这些同步版本的 step1 和 step2,您会看到上面的 ( * ) 现在可以工作了


所有这一切都很有趣(对我来说)的原因是你可以使用相同的配方来做到这一点

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();
于 2012-05-18T00:17:02.380 回答
0

您需要使用fcall而不是 call。call是一个保留的 javascript 函数。

于 2012-05-02T15:44:41.913 回答