0

私は、Node.js アプリケーションで使用される非同期計算の継続渡しスタイルに不慣れで、かなり基本的なコードを理解するのに苦労しています。

私は、imap.gmail.com への imap インターフェイスを作成するライブラリを作成しようとしています。また、「vows'.js」を使用して BDD に従おうとしています (成功のレベルはさまざまです。完全な赤に従っているわけではありません。 ->コード->環境に優しいサイクルですが、そのように言語を使い始めるのは難しいです)。

関連するテスト ケースは次のようになります。

var gmail = require('../lib/gmail.js'),
    vows = require('vows'),
    assert = require('assert'),
    fs = require('fs');

vows.describe('Basic interface tests').addBatch({
  'A GMailInterface object can': {
    topic: function() {
      var gm = Object.create(gmail.GMailInterface);
      var settings_file = 'test/test_settings.json';
      var settings = JSON.parse(fs.readFileSync(settings_file));
      var that = this;
      gm.connect(settings.email,settings.password,function() {
        that.callback(gm); // ERROR BEING GENERATED HERE
      });
    },
     // ACTUAL VOWS OMITTED - the following is just a test of the callback
    'find an email' : {
      topic: function(gm) {
        console.log(">>>",gm);
      },
    }
  }
}).export(module)

「ERROR BEING GENERATED HERE」という行のすぐ上に console.log メッセージを書き込むと、出力されます。その下にメッセージを入れてもしません。テストの出力には、次のエラーが表示されます。

node.js:201
        throw e; // process.nextTick error, or 'error' event on first tick
              ^
Error: Uncaught, unspecified 'error' event.
    at EventEmitter.<anonymous> (events.js:50:15)
    at EventEmitter.emit (/Users/eblume/Repositories/my_stuff/gmail/node_modules/vows/lib/vows.js:236:24)
    at /Users/eblume/Repositories/my_stuff/gmail/node_modules/vows/lib/vows/context.js:31:52
    at Object.callback (/Users/eblume/Repositories/my_stuff/gmail/node_modules/vows/lib/vows/context.js:46:29)
    at Array.0 (/Users/eblume/Repositories/my_stuff/gmail/test/gmail_test.js:17:14)
    at EventEmitter._tickCallback (node.js:192:40)

gmail.js のコードはここに投稿するには多すぎますが、関連するセクションは次のとおりです。以下で質問すれば、さらに投稿できます。

gm.connect = function(username,password,cb) {
  var self = this;
  self.conn = new ImapConnection({
    username: username,
    password: password,
    host: 'imap.gmail.com',
    port: 993,
    secure: true
  });

  async.series([
    function(callback){self.conn.connect(callback); },
    function(callback){self.conn.openBox('[Gmail]/All Mail',true,callback);}
  ],
  function(err,results) {
    if (err) {
      die(err);
    }
    process.nextTick(cb);
  });
};

どこが間違っているのでしょうか?助けてくれてありがとう!

4

1 に答える 1

1

「これ」がどのように機能するかを読むことをお勧めします。誰もそれをいじっていない場合、 'that' はthat.callback'A GMailInterface object can' のようにリテラル文字列でラベル付けされた親オブジェクトを参照します。

この要因があなたをつまずかせているのではないかと思います。「コールバック」は、「トピック」メソッドと同じオブジェクトのメソッドとして定義する必要があります。これは、設定された方法であり、それが機能する方法として私を襲うことはありません。

「this」は通常、デフォルトで最も近い祖先/親オブジェクトを参照します。オブジェクトインスタンスを示す「new」キーワードを使用してコンストラクターとして使用されない限り、ラッピング関数は無視されます。DOM でのイベント コールバックの場合 (ブラウザ JS - イベントに関しては詳しく知らない node.js ではありません)、通常、イベントがトリガーされたオブジェクトを参照します。

それと自分自身で修正される本当のクラッジはありません。オブジェクトに集約オブジェクトがある場合に、最上位のオブジェクトに対処していることを確認するために、これらを使用する傾向があります。

于 2012-04-30T23:55:25.603 に答える