2013-10-02 17 views
2

我想用飞镖有超过MongoDB实例一个很好的和简单的一层,我不能设法做到这一点:如何用dart创建一个简单的mongo外观?

给出一个MongoDB实例“测试 - 蒙戈层”:

蒙戈壳:

使用测试蒙戈层切换到DB测试蒙戈层 db.users.find() { “_id”:的ObjectId( “524b1bf8fbfe21c9c4cdb772”), “名”: “托托”,“登录“:”toto“} {”_id“:ObjectId(”524b1bf8fbfe21c9c4cdb772“),”name“:”Titi“,”login“:”titi“}

而一个model.dart源文件:

class User { 
    String name; 
    String login; 

    User(this.name, this.login) 

    User.fromJson(Map map) { 
    name = map['name']; 
    login = map['login']; 
    } 
} 

而一个persistence.dart源文件:

import 'package:mongo_dart/mongo_dart.dart'; 
import '../lib/model.dart'; 

class PersistenceLayer{ 

    Db _mongodb; 

    PersistenceLayer(this._mongodb) 

    List<User> getUsers() { 

    List<User> users = new List(); 

    _mongodb.open().then((o){ 

     return __mongodb.collection('users').find().forEach((jsonUser){ 
     User user = new User.fromJson(jsonUser); 
     users.add(user); 
     }); 

    }).then((jsonUsers){ 

     _mongodb.close(); 

    }); 

    return users; 
    } 

} 

当我启动了以下测试:

import 'package:mongo_dart/mongo_dart.dart'; 
import 'package:unittest/unittest.dart'; 
import '../lib/model.dart' ; 
import '../lib/persistence.dart' ; 
main() { 

    Db db = new Db("mongodb://127.0.0.1/test-mongo-layer"); 

    test('Test get users',() { 

     PersistenceLayer persistence = new PersistenceLayer(db); 
     var users = persistence.getUsers(); 
     expect(users.length, 2); 
    } 

} 

然后,有一个例外:

未捕获的错误:预期:< 2> 实际:< 0> <

这是很简单,但它不工作,我必须和未来,因为残局当我执行它调试甚至不执行的代码......

SOLUTION:感谢亚历山大

持久性.dart源文件:

Future<List<User>> getUsers() { 
    List<User> users = new List(); 
    return _mongodb.open() 
       .then((_){ 
        return _mongodb.collection('users').find().forEach((jsonUser){ 
         User user = new User.fromJson(jsonUser); 
         users.add(user); 
         }); 
       }) 
       .then((_) { 
        return users; 
       }) 
       .whenComplete((){ 
        _mongodb.close(); 
       }); 
    } 

测试:

test('Test get users',() { 
     PersistenceLayer persitence = new MongoPersistence(db); 
     Future<List<User>> usersFuture = persistence.getUsers(); 
     usersFuture.then((users) => expect(users.length, 2) ); 
}); 

回答

0

你混合同步和异步代码在你。在返回getUsers()之后完成users的填充。这就是为什么users是空的。

为了更好地了解Future和异步代码,您可以查看The Event Loop and Dart

getUsers()工作版本应该像下面的(未测试):

import 'dart:async'; 
import 'package:mongo_dart/mongo_dart.dart'; 
import '../lib/model.dart'; 

class PersistenceLayer{ 
    Db _mongodb; 

    PersistenceLayer(this._mongodb) 

    Future<List<User>> getUsers() { 
    List<User> users = new List(); 
    return _mongodb.open().then((_){ 
     _mongodb.collection('users').find().forEach((jsonUser){ 
     User user = new User.fromJson(jsonUser); 
     users.add(user); 
     }); 
    }).whenComplete((_){ 
     _mongodb.close(); 
    }).then((_) => users); 
    } 
} 

基本上你返回完整Future链,并在最后then返回users

+0

所以我不能让getUsers()同步,只要它使用提供异步函数的mongo_dart库? –

+0

确切!异步是有感染力的。一旦你在一个函数中有一个'Future',你几乎总是必须使该函数返回一个'Future'。 –