未来的序列

时间:2014-12-14 09:33:18

标签: dart dart-async

在下面的代码中,我认为f1 > f2 > f3将是调用顺序,但只调用f1。如何顺序调用3个函数?

我已将以下内容添加到main函数中,并且按预期工作,但我想知道是否还有其他明确的方法可以实现相同的结果?

print('Starting main');
List<Future> futures=new List<Future>();
Future v1=f1();
Future v2=f2();
Future v3=f3();
futures.add(v1);
futures.add(v2);
futures.add(v3);
Future.wait(futures);
print('Leaving main');

import 'dart:async';

Duration d1 = new Duration(seconds: 5);
Duration d2 = new Duration(seconds: 10);
Duration d3 = new Duration(seconds: 15);

bool r1 = false;
bool r2 = false;
bool r3 = false;

void cb1() {
    print('Entering CB1');
    r1 = true;
    print('Leaving CB1');
}

void cb2() {
    print('Entering CB2');
    r2 = true;
    print('Leaving CB2');
}

void cb3() {
    print('Entering CB3');
    r3 = true;
    print('Leaving CB3');
}

Timer t1;
Timer t2;
Timer t3;

Future<bool> start1() {
    print('Entering start1');
    Completer<bool> r = new Completer();
    r.future.then((_) {
        while (!r1) {

        }
        print('Completing start1');
        r.complete(true);
    });

    print('Leaving start1');
    return r.future;
}

Future<bool> start2() {
    print('Entering start2');
    Completer<bool> r = new Completer();
    r.future.then((_) {
        while (!r2) {

        }
        print('Completing start2');
        r.complete(true);
    });

    print('Leaving start2');
    return r.future;
}

Future<bool> start3() {
    print('Entering start3');
    Completer<bool> r = new Completer();
    r.future.then((_) {
        while (!r3) {

        }
        print('Completing start3');
        r.complete(true);
    });

    print('Leaving start3');
    return r.future;
}

Future<bool> f1() {
    print('Entering f1');
    Completer<bool> result = new Completer();
    t1 = new Timer(d1, cb1);
    result.complete(start1());

    print('Leaving f1');
    return result.future;
}

Future<bool> f2() {
    print('Entering f2');
    Completer<bool> result = new Completer();
    t2 = new Timer(d2, cb2);
    result.complete(start2());

    print('Leaving f2');
    return result.future;
}

Future<bool> f3() {
    print('Entering f3');
    Completer<bool> result = new Completer();
    t3 = new Timer(d3, cb3);
    result.complete(start3());

    print('Leaving f3');
    return result.future;
}

void main() {
    print('Starting main');
    f1().then((_) {
        f2().then((_) {
            f3().then((_) {

            });
        });
    });
    print('Leaving main');
}

2 个答案:

答案 0 :(得分:2)

首先,您应该澄清为什么需要这个。我真的不明白为什么你希望它们按顺序执行 - 你应该给我们一些关于它背后概念的更多信息。

请告诉我们您想要完成的更多信息!以下代码以某种方式完成了我认为你想要的东西:

//我对代码进行了更多清理:

import 'dart:async';

Duration d1 = new Duration(seconds: 5);
Duration d2 = new Duration(seconds: 10);
Duration d3 = new Duration(seconds: 15);

Future<bool> f1() {
  print('Entering f1');
  Completer<bool> r = new Completer();
  new Timer(d1, () {
    r.complete(true);
  });
  print('Leaving f1');
  return r.future;
}

Future<bool> f2() {
  print('Entering f2');
  Completer<bool> r = new Completer();
  new Timer(d2, () {
    r.complete(true);
  });
  print('Leaving f2');
  return r.future;
}

Future<bool> f3() {
  print('Entering f3');
  Completer<bool> r = new Completer();
  new Timer(d3, () {
    r.complete(true);
  });
  print('Leaving f3');
  return r.future;
}

void main() {
    print('Starting main');
    f1().then((_) {
        f2().then((_) {
            f3().then((_) {

            });
        });
    });
    print('Leaving main');
}

答案 1 :(得分:2)

在start1中,返回一个永不完成的未来。基本上,你做的是:

start1() {
  var r = new Completer();
  r.then.((_) { ... r.complete() ... });
  return r.future;
}

由于r唯一完整需要r才能完成,因此不会发生。 这意味着result的{​​{1}}将永远等待f1返回的未来,而start1永远不会进入f1().then((_) ...回调。这就是为什么没有发生的原因。

您还有一个忙等待循环then。如果您打算在while (!r1) {}不正确的情况下挂起,那么它可以正常工作。期货不会在Dart中同时执行。您必须在调用任何未来的回调之前返回事件循环,因此如果r1在到达循环时为false,则它将保持为false,因为没有其他代码会中断循环。

如果我通过r1了解您的需求,可以尝试将其重写为:

start1