DART:如何编写返回Future的timeconsuming函数

时间:2014-01-01 12:50:08

标签: dart dart-async

我必须编写一个耗时的函数,如果它已经准备就会返回一个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

2 个答案:

答案 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是错误(程序员错误),则同步投掷通常是正常的。然后它的行为与在检查模式下传入字符串的行为相同。