我在Dart 2.1.0中进行编程,试图通过监听自定义流来更新某些状态:

import 'dart:async';

void main() {
  final controller = StreamController<int>();
  final divisibleBy2 = controller.stream.map((i) => i % 2 == 0);

  var seen2x = false;
  divisibleBy2.listen((y) {
    seen2x = y;
  });

  controller.add(2);
  print(seen2x);
}

当我运行它时,它会打印false。显然,print函数的调用比监听器函数的调用早。状态不会及时更新。

通过await -ing在controller.add(2)上,我可以直接获得订单:
import 'dart:async';

void main() async {
  final controller = StreamController<int>();
  final divisibleBy2 = controller.stream.map((i) => i % 2 == 0);

  var seen2x = false;
  divisibleBy2.listen((y) {
    seen2x = y;
  });

  await controller.add(2);
  print(seen2x);
}

现在,它打印true。监听器函数在print之前调用。

但是为什么在这种情况下await有所作为? StreamController's add() method不返回Future,因此我不确定await为什么重要。实际上,在现实世界中,流网络变得越来越复杂,await有时不足以确保执行顺序。这又是一个问题。

现在,我只想看看await是否是正确的方法。提前致谢。

最佳答案

此处await有所不同的原因是,任何await都会至少等待一个微任务-不管您等待的值是否是Future。如果它是Future,它将等待它完成,或者等待它已经完成的微任务。如果您在await null;之后有controller.add(2);,则其行为将相同。

通常,StreamController不知道所有监听器何时都接收到该事件,尤其是考虑异步监听器或 Stream.asyncMap 之类的事件时。

10-05 20:59
查看更多