我希望使用dart在mongodb实例上有一个漂亮而简单的层,但我无法做到这一点:
给出了一个mongodb实例“test-mongo层”:
蒙戈炮弹:
使用test-mongo层切换到db test-mongo层db.users.find() { "_id“:ObjectId("524b1bf8fbfe21c9c4cdb772")、”名称“:"Toto”、“登录”:"toto“{ "_id”:ObjectId("524b1bf8fbfe21c9c4cdb772")、“名称”:"Titi“、”登录“:"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><
这很简单,但不起作用,我必须处理未来,因为当我在调试时执行它时,代码甚至没有被执行.
解决方案:感谢亚历山大
persistence.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) );
});发布于 2013-10-02 08:52:43
您正在getUsers中混合同步和异步代码。users的填充是在返回getUsers()之后完成的。这就是为什么users是空的。
要更好地理解Future和异步代码,您可以查看事件循环与省道。
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。
https://stackoverflow.com/questions/19132562
复制相似问题