在下面的代码中,我认为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');
}
答案 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