更正:以下是两个答案,问题似乎是Dart特有的,因为C#实现Task.Wait
可以实现所需的效果。感谢您提供更多有关为什么无法在 Dart 上实现它的原因或如何实现的信息。我很乐意以当前形式结束这个问题。
在某些情况下,让同步函数内部使用异步调用在交付结果之前等待其完成是有意义的。 C#和Dart都明确不允许这样做:任何使用await
的东西都必须标记为async
(因此返回 future )。
Dart中的一个简单示例,但对于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");
}
}
问题:为什么不允许这样做?
最佳答案
await
是一个异步等待,因此将其包含在同步函数中没有任何意义。为了异步,方法需要在等待的操作启动时返回,而同步方法需要运行到完成。
您可以改用同步等待,在这种情况下,您的方法不必是async
。在C#中,您可以通过对返回的任务调用Wait()
方法来执行此操作。
关于asynchronous - 为什么 'await'不能在普通函数中使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33343911/