代码之家  ›  专栏  ›  技术社区  ›  jabgibson

使用Dart,如何使用Future的

  •  9
  • jabgibson  · 技术社区  · 10 年前

    我正在尝试创建一个非常简单的http服务器,它只做一件事。收到HttpRequest后,它在本地数据库服务器上运行一个查询,并基于该查询返回一个字符串。

    我在学习飞镖,我在把握未来方面遇到了困难。我以为我理解它们,但这个例子让我相信我真的不知道它们是如何工作的。因此,我不仅在寻找解决这个问题的方法,而且也很乐意接受任何建议。

    注意:这段代码是我一直试图完成的一个非常原始的例子,为了接触Stackoverflow社区,我尽可能缩短/简化了它,同时保持了问题的完整性。

    这是我的server.dart代码

    import 'dart:io';
    import 'package:sqljocky/sqljocky.dart';
    
    
    final connection = new ConnectionPool(host: 'localhost', port: 3306, user: 'root', password: null, db: 'server1');
    
    main() {
    
      HttpServer.bind(InternetAddress.ANY_IP_V4, 9090)..then((server) {
        print("serving generic database query on localhost:9090");
        server.listen((request) {
          if (request.method == "GET") {
            request.response.write(getResults());
            request.response.close();
          }
          else {
            request.response.statusCode = HttpStatus.BAD_REQUEST;
          }
        });
      });
    }
    
    
    String getResults() {
    
      StringBuffer sb = new StringBuffer();
      sb.write("START--");
      connection.query("select name, email, zkey from users")
          ..then((results) {
        results.forEach((row) {
          sb.write(row.toString());
          print(row.toString());
        });
      });
    
      sb.write("--END");
      print(sb.toString());
    
      return sb.toString();
    }
    

    因此,如果我向该服务器发送请求,它将返回“开始----结束”。 服务器打印出预期的查询结果,然后打印出“START---END”。 这使我相信,在查询结果完成处理之前,我的请求响应正在关闭并返回。

    因此,无论我卷曲localhost:9090/asdf还是实际构建客户端http请求发送方,我都没有得到预期的响应。。。其是数据库查询结果。

    提前感谢

    1 回复  |  直到 9 年前
        1
  •  7
  •   Community Heathro    4 年前

    那个 "START----END" 打印“无序”是期货的一种行为,一开始大多数开发人员都会感到困惑。
    像这样的电话 connection.query() 返回未来的命令不立即执行,而是登记在队列中以供稍后执行。当前执行线程将继续执行,直到完成,然后一个接一个地处理队列。

    在代码中不起作用的是您执行异步调用 connection.query() 然后继续,就像它是一个同步呼叫一样。这在达特是行不通的。当您开始异步执行时,无法返回同步。(据我所知,计划的异步/等待应该可以解决这个问题)。

    更多详情请访问dartlang.org The Event Loop and Dart

    EDIT测试代码

    import 'dart:io';
    import 'package:sqljocky/sqljocky.dart';
    
    final connection = new ConnectionPool(host: 'localhost', port: 3306, user: 'root', password: null, db: 'server1');
    
    main() {    
      HttpServer.bind(InternetAddress.ANY_IP_V4, 9090)..then((server) {
        print("serving generic database query on localhost:9090");
        server.listen((request) {
          if (request.method == "GET") {
            getResults()
            .then((result) { 
              print('Result: $result'); 
              request.response.write(result);
              request.response.close();
            });
          }
          else {
            request.response.statusCode = HttpStatus.BAD_REQUEST;
          }
        });
      });
    }
    
    Future<String> getResults() { 
    
      StringBuffer sb = new StringBuffer();
      sb.write("START--");
      return connection.query("select name, email, zkey from users") 
      .then((Result results) => results.toList())
      .then((list) {
        list.forEach((row) {
          sb.write(row.toString());
        });
        sb.write("--END");
      })
      .then((_) => sb.toString());
    }
    

    另请参阅Gregs关于如何读取SqlJocky结果的回答 sqljocky querying database synchronously

    推荐文章