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;
};

数据库创建是异步的,在我的测试用例中,我检查调用 create() 函数是否实际上会产生两个不同的对象:

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

不过,这两行 console.log 的输出让我感到惊讶:

两个数据库。db1:[对象对象],db2:[对象对象]
数据库:{}

因为我将 twoDBs 传递给测试回调,所以我曾期望 dbs 和 twoDBs 是某个对象,但它们似乎不是。任何人都可以帮我解决这里发生的事情吗?

4

1 回答 1

0

dbs范围在该回调内。您将无法访问,因为调用的this.callback()范围不在该回调中。您需要一起传递它,或者在回调中this.callback(null, dbs, twoDBs)创建一个 vartopic并分配给它。dbs这不是 Vows 的问题。它更多地与 JavaScript 的词法作用域和回调有关。

在这些情况下,我所做的是通过将参数添加到this.callback().

编辑:上面的内容是不正确的,但修复出现在下面的评论中:

如果你把 var that = this; 在主题中并将其更改为 that.callback(null, twoDBs); 怎么了?

于 2012-06-07T15:57:46.883 回答