首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用飞镖在芒果上创建一个简单的立面?

如何用飞镖在芒果上创建一个简单的立面?
EN

Stack Overflow用户
提问于 2013-10-02 08:08:38
回答 1查看 453关注 0票数 2

我希望使用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源文件:

代码语言:javascript
复制
class User {
  String name;
  String login;

  User(this.name, this.login)

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

和persistence.dart源文件:

代码语言:javascript
复制
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;
  }

}

启动以下测试时的 :

代码语言:javascript
复制
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源文件:

代码语言:javascript
复制
  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();
                });
   }

测试:

代码语言:javascript
复制
test('Test get users', () {
      PersistenceLayer persitence = new MongoPersistence(db);
      Future<List<User>> usersFuture = persistence.getUsers();
      usersFuture.then((users) => expect(users.length, 2)   );
});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-02 08:52:43

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

要更好地理解Future和异步代码,您可以查看事件循环与省道

getUsers()的工作版本应该如下所示(未经测试):

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19132562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档