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デバッガプラグインをインストールし、1行ずつデバッグしました。残念ながら、エラーの開始が見つかりません。

私は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が行うことは、同期関数(つまり、値を返す関数)を取得し、それをpromiseに変換することです。

ドキュメントには、次のような状況があります。

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();

ここで私が混乱しているのは、2つの「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

callの代わりにfcallを使用する必要があります。call予約済みのJavaScript関数です。

于 2012-05-02T15:44:41.913 に答える