我必须编写一个耗时的函数,如果它已经准备就会返回一个Future。 下面的方法是否正确,或者我在第9行的耗时算法是否阻止了程序直到准备就绪。在这种情况下,我需要做什么,将控制权交还给eventloop或者还有什么可以成为解决方案?
Future<int> timeconsumingFunctionReturningFuture(int i) {
var completer = new Completer();
if (i==0) {
completer.completeError(88);
return completer.future;
} else {
int rc;
// Line9: rc = timeconsuming algorithm, to calculate rc
completer.complete(rc);
return completer.future;
}
}
Tnx Micha
答案 0 :(得分:3)
您的代码可能无法正常工作,因为您的算法可能会阻止完成者的返回。 试试这种方式:
Future<int> timeconsumingFunctionReturningFuture(int i) {
var completer = new Completer();
if (i==0) {
completer.completeError(88);
} else {
Timer.run(() {
int rc;
// Line9: rc = timeconsuming algorithm, to calculate rc
completer.complete(rc);
});
}
return completer.future;
}
这样,您的耗时算法就会异步运行,并且会立即返回未来。
我自己没有尝试过,但是这个较短的版本也应该可以工作(没有创建完成者)
return new Future.delayed(Duration.ZERO, () {
// timeconsuming algorithm
});
答案 1 :(得分:2)
GünterZöchbauer的解决方案是正确的,但您可以简化代码:
Future<int> timeconsumingFunctionReturningFuture(int i) {
if (i == 0) return new Future.error(88);
return new Future(() {
int rc;
// Line9: rc = timeconsuming algorithm, to calculate rc
return rc;
});
}
或者你甚至可以将错误检查放入未来:
Future<int> timeconsumingFunctionReturningFuture(int i) {
return new Future(() {
if (i == 0) throw 88;
int rc;
// Line9: rc = timeconsuming algorithm, to calculate rc
return rc;
});
}
另请注意:如果为i
传递0是错误(程序员错误),则同步投掷通常是正常的。然后它的行为与在检查模式下传入字符串的行为相同。