在Dart的异步方法中是否有一种写“等待变量改变”的好方法?

时间:2017-12-12 15:24:28

标签: dart

我在Dartlang中编写了一个程序,它停止处理,直到变量foo变为false,如下所示。 它是可执行的,但是在while语句中继续返回Future是笨拙的。 有没有办法清楚地写出来?

  Future asyncMethod() async {

      while (foo) {
        await new Future(() {
          return null;
        });
      }

Unity的协程可以写成如下所示的单行,所以我想让它更清晰。

yield return new WaitWhile(() => foo);

2 个答案:

答案 0 :(得分:3)

您使用计时器定期轮询变量。有很多方法可以做到这一点。我只是去完全直接的实施:

Future waitWhile(bool test(), [Duration pollInterval = Duration.zero]) {
  var completer = new Completer();
  check() {
    if (!test()) {
      completer.complete();
    } else {
      new Timer(pollInterval, check);
    }
  }
  check();
  return completer.future;
}

使用该功能,您只需编写

即可
await waitWhile(() => foo);

等待foo变为假。

答案 1 :(得分:0)

通过使用 Future.doWhile

没有轮询间隔:

await Future.doWhile(() => isPaused);

使用轮询间隔:

if (isPaused) {
  await Future.doWhile(() => Future.delayed(interval).then((_) => isPaused));
}