asynchronous - 为什么 'await'不能在普通函数中使用?

标签 asynchronous dart async-await

更正:以下是两个答案,问题似乎是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/

相关文章:

javascript - 安全地从异步 foreach 更新值?

flutter - 在 Flutter 中使用 ListView 或 CustomScrollView 在顶部添加新元素时如何保持滚动位置

dart - Flutter:读取文件,解析为 JSON,然后转换为对象以使用点表示法

swift - 如何在 Swift 5.5 中等待来自同步函数的异步函数?

C# .NET 异步等待返回类型

c# - Azure 注销异步

javascript - Node.JS - 如何识别哪个异步 HTTP GET 响应在回调中返回数据?

dart - 如何使用 RxDart BehaviourSubject 更新 flutter widget?

c# - 在非异步方法中调用异步方法

javascript - 为 node.js 回调实现超时