【发布时间】:2015-10-27 21:46:59
【问题描述】:
更正:从两个答案来看,问题看起来是 dart 特有的,因为 C# 实现 Task.Wait 允许达到预期的效果。我将不胜感激任何进一步的信息,说明为什么这在 dart 中不可能或如何在那里实现它。我很乐意以目前的形式结束这个问题。
在某些情况下,让同步函数在内部使用异步调用等待它们完成后再传递结果是有意义的。这在 C# 和 Dart 中都是明确不允许的:任何使用 await 的东西都必须标记为 async(因此返回一个未来)。
一个简单的例子,但同样适用于 C#:
免责声明:这不是我做事的方式,所以不建议将所有方法转换为异步的“正确”解决方案;这里的代码只是为了说明这个问题。
我有一个通用包装器的完全异步实现,用于对某些特定 REST API 的 HTTP 请求。它会进行一些登录、身份验证等操作:
class RequestProcessor {
Future post(String path, [payload]) async {
return request("POST", path, payload);
}
}
我想实现一个面向用户的高级 API,将请求转换为 REST-API。其中一些方法我希望同步。这是我想要但不允许拥有的:
class API {
final RequestProcessor processor;
API(this.processor);
// this takes long and should be asynchronous, happy with a future (OK)
Future getQueryResults(query) async {
return await processor.post("/query", query);
}
// here I would prefer to have it synchronous (COMPILE ERROR)
String getVersion() {
return await processor.post("/version");
}
}
问题:为什么不允许这样做?
【问题讨论】:
-
询问语言设计者,而不是我们。
-
这正是
async关键字的作用:启用await关键字。如果没有async,他们可能已经完成了,但这会导致模棱两可。本文解释了它的设计原因:blogs.msdn.com/b/ericlippert/archive/2010/11/11/… -
在 Dart 中异步是异步的并且保持异步。对此无能为力。
-
我想了解其背后的设计决策:为什么会这样?显然 C# 可以处理它。
标签: asynchronous dart async-await