Dart如何实现运行异步代码不阻塞?

How does Dart run asynchronous code without blocking?

Dart如何做到运行异步代码不阻塞? 例如:

void test(User user) async {
    print('test');

    String fullName = user.firstName + ' ' + user.lastName;

    final result = await sendRequest(fullName);

    print('${result}');
}

我理解的是Dart 运行的async函数时,会先执行await之前的代码,然后将剩下的代码包装到Future中,放到Event Loop中。但是,我们正在等待 (await sendRequest(fullName)) 的 Future 如何不阻塞 运行 其他同步代码?我们应该等待请求完成,但它也需要一些代码来检查我们是否收到或未收到响应。它如何不阻止其他操作,例如按钮点击?

函数 return 位于第一个 await。它 return 是一个稍后将完成的未来(由于 void return 类型而被忽略)。该函数中的所有其他内容都是对来自其他期货(或流,如果您使用 await for)的回调的反应。

这里的async函数基本上改写成这样:

void test(User user) {
  print('test');
  String fullName = user.firstName + ' ' + user.lastName;
  return sendRequest(fullName).then((final result) { // <-- Returns here, synchronously.
    print('${result}');    // <-- Gets called by the future of `sendRequst(fullName)`.
  });
}

此转换类似于 continuation-passing style 转换,因为它采用延续(await 之后函数体中的控制流)并将其变成函数。

(实际上,转换更复杂,因为它需要考虑循环、try/catch/finally,甚至 break 语句。因为其中,即使是像这样一个简单的例子也可能会被转换成比绝对必要的更复杂的东西。