我需要我的异步函数等待某些表达式进行验证(例如 x == true),然后再继续其余代码。
现在我正在使用像这样的while循环
var x = false;
someFunction() async {
// here I want to await for
// as long as it takes for x to become true
while(!x) {
await new Future.delayed(new Duration(milliseconds: 250));
}
// i put 250 millisecond intentional delay
// to protect process from blocking.
// x is to be set true by external function
// rest of code ...
}
await someFunction();
您认为有更好的方法等待 x 更改为 true 后再继续执行吗? 谢谢你
你可以做这样的事情。
Future<void> _waitUntilDone() async {
final completer = Completer();
if (_loading) {
await 200.milliseconds.delay();
return _waitUntilDone();
} else {
completer.complete();
}
return completer.future;
}
甚至更好
var completer;
Future<void> _waitUntilDone() async {
completer = Completer();
return completer.complete();
}
void done() {
if (completer)
completer.complete();
}
在完成调用时,我们也可以发出一些值。
您可以使用三种方式进行异步/等待:-
void method1(){
List<String> myArray = <String>['a','b','c'];
print('before loop');
myArray.forEach((String value) async {
await delayedPrint(value);
});
print('end of loop');
}
void method2() async {
List<String> myArray = <String>['a','b','c'];
print('before loop');
for(int i=0; i<myArray.length; i++) {
await delayedPrint(myArray[i]);
}
print('end of loop');
}
Future<void> delayedPrint(String value) async {
await Future.delayed(Duration(seconds: 1));
print('delayedPrint: $value');
}
您可以将“x”设为 Completer,而不是将其设为布尔值。
将
x = true
替换为 x.complete()
和 x = false
由 x = Completer()
你写的函数会变成这样:
var x = Completer();
someFunction() async {
// waiting for x to complete
await x.future;
// continue with executing this func
}
这是我的解决方案:
Future<bool> waitForCondition(bool Function() condition,
{Duration checkInterval = const Duration(milliseconds: 200),
Duration timeout = const Duration(seconds: 30)}) async {
bool response = true;
bool done = false;
Future.delayed(
timeout,
() {
response = false;
done = true;
},
);
while (!condition()) {
await Future.delayed(checkInterval);
if (done) {
break;
}
}
return response;
}
有这样的事吗?
delayed() async {
await Future.delayed(Duration(seconds: 2));// or some time consuming call
return true;
}
somefn() async{
var x = await delayed();
print(x);// gives true
}
somefn();