0

Node.jsのTDDの演習として、フラットファイルとして保存する非常に単純な「データベース」を実装しようとしています。DBモジュールコードの最初の部分は次のとおりです。

var fs = require( 'fs' );

exports.create = function( path, readycallback ) {
    new FlatFileDB( path, readycallback );
};

function FlatFileDB( path, readycallback ) {
    this.path = path;
    readycallback( null, this );
}

FlatFileDB.prototype.getPath = function() {
    return this.path;
};

DBの作成は非同期であり、私のテストケースでは、create()関数を呼び出すと実際に2つの異なるオブジェクトが生成されるかどうかを確認するためのチェックがあります。

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

var twoDBs = {};

vows.describe( 'flatfileDB' ).addBatch( {
    'creating the database': {
        topic: flatfileDB,
        'calling create': {
            topic: function( flatfileDB ) {
                flatfileDB.create( './createTest', this.callback );
            },
            'results in an object with the path passed in': function( err, db ) {
                assert.equal( db.getPath(), './createTest' );
            }
        },
        'calling create more than once': {
            topic: function( flatfileDB ) {
                flatfileDB.create( './db1', function( err, newdb ) {
                    twoDBs.db1 = newdb;
                    flatfileDB.create( './db2', function( err, newdb ) {
                        twoDBs.db2 = newdb;
                        this.callback( null, twoDBs );
                    } );
                });
            },
            'results in two objects with different paths.': function( err, dbs ) {
                console.log( 'twoDBs.  db1: ' + twoDBs.db1 + ', db2: ' + twoDBs.db2 );
                console.log( 'dbs: ' + JSON.stringify( dbs ) );
                assert.notEqual( twoDBs.db1.getPath(), twoDBs.db2.getPath() );
            }
        }
    },
}).run();

ただし、これら2つのconsole.log行の出力には驚かされます。

twoDB。db1:[オブジェクトオブジェクト]、db2:[オブジェクトオブジェクト]
dbs:{}

2つのDBをテストコールバックに渡すので、dbとtwoDBが何らかのオブジェクトであると期待していましたが、そうではないようです。誰かがここで何が起こっているのか私を助けることができますか?

4

1 に答える 1

0

dbsスコープはそのコールバックの内部にあります。のinvokeはthis.callback()そのコールバックでスコープされていないため、アクセスできなくなります。一緒に渡すthis.callback(null, dbs, twoDBs)か、で変数を作成してコールバックでtopic割り当てる必要があります。dbsこれはVowsではそれほど問題ではありません。これは、JavaScriptの字句スコープとコールバックと関係があります。

これらの場合に私が行うことは、パラメーターをに追加することにより、必要な変数を渡すことthis.callback()です。

編集:上記は正しくありませんが、修正は以下のコメントで出てきました:

var that=thisを置くと; トピックで、それをthat.callback(null、twoDBs);に変更します。何が起こるのですか?

于 2012-06-07T15:57:46.883 に答える