Rethinkdb返回函数

时间:2015-05-19 23:32:49

标签: node.js rethinkdb

我有以下功能:

    function test(room_number, user_id) {
       return r.table('wins').filter({"room_number": room_number, "user_id" : user_id}).count().run(connection, function(err, cursor){

        // I get the right result
        console.log(cursor);
       });
    }

如何将此光标返回测试功能,以便我可以调用

test(2000,1),我得到了结果?

我只得到这个结果:

{ _bitField: 1,
  _fulfillmentHandler0: [Function: successAdapter],
  _rejectionHandler0: [Function: errorAdapter],
  _progressHandler0: undefined,
  _promise0: [Function],
  _receiver0: [Circular],
  _settledValue: undefined }

我希望有人可以帮助我:)。

1 个答案:

答案 0 :(得分:0)

这个函数是异步的(因为它是JavaScript),没有办法让它同步。因此,test(2000, 1)不可能返回光标。

您需要做的是传递回调,然后根据回调提供的值测试结果。请记住,在Node.js中,按照惯例,我们将错误和结果传递给回调函数。

因此,您需要像这样编写测试:

function test(room_number, user_id, callback) {
       return r.table('wins').filter({"room_number": room_number, "user_id" : user_id}).count().run(connection, callback);
    }

如果您希望将结果作为数组,则必须执行以下操作:

function test(room_number, user_id, callback) {
       return r.table('wins').filter({"room_number": room_number, "user_id" : user_id}).count().run(connection, function(err, cursor) {
         if (err) callback(err, null);
         cursor.toArray(callback);
       };
    }

现在,当你运行测试时,你必须传递一个回调函数,它会将你期望的结果与实际结果进行比较。

test(2000, 1, function (err, cursor) { // If you use the first cursor
   // Convert cursor to array
   cursor.toArray(function (err, result) {
      // Compare `result` with expectations
      // Make sure that `result` is equal to [1, 2, 3];
      assert.deepEqual(result, [1, 2, 3]);
   });
})

为了清楚起见,这是一个JavaScript问题,与RethinkDB的工作原理无关。由于RethinkDB正在执行网络调用,因此该操作必须是异步的。

使用Mocha

如果您使用Mocha作为测试框架,则可以执行以下操作。

it('should equal [1, 2, 3]', function (done) {
 return r.table('wins').filter({"room_number": room_number, "user_id" : user_id}).count().run(connection, function(err, cursor) {
   if (err) callback(err, null);
   cursor.toArray(function () {
     // Compare `result` with expectations
     // Make sure that `result` is equal to [1, 2, 3];
     assert.deepEqual(result, [1, 2, 3]);
     // Tell Mocha that you're done testing and 
     // want to continue to the next test
     done();
   });
};