使用Dart,如何使用Future的

使用Dart,如何使用Future的,dart,dart-io,dart-async,sqljocky,Dart,Dart Io,Dart Async,Sqljocky,我试图创建一个非常简单的http服务器,它只做一件事。收到HttpRequest后,它在本地数据库服务器上运行一个查询,并基于该查询返回一个字符串 我正在学习飞镖,我很难把握未来。我以为我理解它们,但这个例子让我相信我真的不知道它们是如何工作的。所以,我不仅在寻找解决这个问题的方法,而且我也乐意接受任何建议 注意:这段代码是我一直试图完成的一个非常原始的示例,为了接触Stackoverflow社区,我尽可能地缩短/简化它,同时保持问题的完整性 这是我的server.dart代码 导入“dart:

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

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

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

这是我的server.dart代码

导入“dart:io”; 导入“包:sqljocky/sqljocky.dart”; 最终连接=新连接池主机:“localhost”,端口:3306,用户:“root”,密码:null,数据库:“server1”; 主要{ HttpServer.bindInternetAddress.ANY_IP_V4,9090..thenserver{ 本地主机上的printserving通用数据库查询:9090; server.listenrequest{ 如果request.method==GET{ request.response.writegetResults; 请求、响应、关闭; } 否则{ request.response.statusCode=HttpStatus.BAD\u请求; } }; }; } 字符串获取结果{ StringBuffer sb=新的StringBuffer; 某人开始写作; connection.query从用户处选择名称、电子邮件、zkey …然后是结果{ 结果:forEachrow{ 某人写了一本书; printrow.toString; }; }; 某人写了一封信; 打印某人的字符串; 使某人恢复原状; } 因此,如果我向该服务器发送请求,它将返回START--END。 服务器打印出预期的查询结果,然后打印出START--END。 这使我相信,在查询结果处理完成之前,请求-响应正在关闭并返回

因此,无论我是curl localhost:9090/asdf还是实际构建一个客户端http请求发送器,我都不会得到我期望的响应。。。这是一个数据库查询结果

提前感谢

开始-结束打印“无序”是一种未来行为,大多数开发人员在开始时都会感到困惑。 返回未来的类似connection.query的调用不会立即执行,而是登记在队列中供以后执行。当前执行线程将继续执行,直到完成,然后依次处理队列

在代码中不起作用的是执行异步调用connection.query并继续,就像它是一个同步调用一样。这在Dart中永远不起作用。启动异步执行时,无法返回同步。据我所知,计划的async/await应该可以解决这个问题

更多详情请访问dartlang.org

编辑测试代码 导入“dart:io”; 导入“包:sqljocky/sqljocky.dart”; 最终连接=新连接池主机:“localhost”,端口:3306,用户:“root”,密码:null,数据库:“server1”; 主{ HttpServer.bindInternetAddress.ANY_IP_V4,9090..thenserver{ 本地主机上的printserving通用数据库查询:9090; server.listenrequest{ 如果request.method==GET{ 获得结果 .thenresult{ 打印“结果:$Result”; request.response.writeresult; 请求、响应、关闭; }; } 否则{ request.response.statusCode=HttpStatus.BAD\u请求; } }; }; } 未来的getResults{ StringBuffer sb=新的StringBuffer; 某人开始写作; return connection.query从用户处选择名称、电子邮件、zkey .thenResult=>results.toList .然后列表{ list.forEachrow{ 某人写了一本书; }; 某人写了一封信; } 然后=>sb.toString; }
另请参见Gregs关于如何阅读SqlJocky结果这个问题的答案

现在我已经用测试代码更新了答案。另请注意:您不应该使用。。对于。那么,只有一个点,否则您将连接所有连续的。然后调用第一个未来,但您应该始终连接到最后一个返回的未来。看起来不错。我不知道如何在回程上继续前进。谢谢@günter-zöchbauer