【发布时间】:2016-08-01 22:36:36
【问题描述】:
假设我们使用配置了超时的 http 包从 dart:io 应用程序发出 HTTP 请求:
dynamic getSomething(String url) async {
try {
var response = await http.get(url).timeout(new Duration(seconds: 30));
return JSON.decode(response.body);
} catch (_) {
return null;
}
}
这里有两个future,一个由http.get(请求Future)生成,另一个由Future.timeout(超时Future)生成。如果请求 Future 完成, 它的值被传递到超时 Future ,这反过来又完成了。这很好。
但是,如果 http.get 未在 30 秒内完成,则超时未来将完成并抛出 TimeoutException。请求 Future 会发生什么? 当然,与请求 Future 相关的一些状态和内存分配并没有通过运行超时 Future 来专门清理。更糟糕的是, 如果请求 Future 在超时后完成,该代码仍将执行。超时Future是否有责任专门取消请求- 在这种情况下,这是不可能的,因为它被埋在包中 - 或者是否有其他必须使用的机制?
更一般地说,永远不会完成的 Future 最终会清理其状态和内存,还是永远挂起?
【问题讨论】:
-
看起来没有进行清理。我猜超时回调必须处理这个问题。
HttpRequestgithub.com/dart-lang/http/issues/21 有一个相关问题
标签: asynchronous dart timeout async-await future