如何在没有“异步”的情况下等待未来的完成

时间:2018-07-12 19:12:20

标签: dart

如何在没有“异步”和“未来”的情况下等待未来的完成?

在我使用的库中,所有功能都是异步的。

// must return <bool>
bool my_func(int x){

          //returns Future<int>
  var tmp = somelib.somefunc( ... );
  //wait y
  return x == y;
}

我试图写我的“等待”,但是 等待while循环结果会冻结所有内容。

dynamic my_await(Future f) {
  dynamic x;
  bool completed = false;
  f.then((v){
    x = v;
    completed = true;
  });
  do {} while (!completed);
  return x;
}

Dart VM version: 1.24.3 (Mon Dec 18 16:57:48 2017) on "linux_x64"

2 个答案:

答案 0 :(得分:3)

一个同步函数,或者实际上是任何Dart函数,在调用它们时会立即返回一个值。如果要立即返回一个布尔值,并且该布尔值的值取决于将来完成的结果,那么没有办法及时计算该布尔值。

如果您需要等待未来,则您的函数 是异步的。即使您尚不知道结果,也需要立即返回。这就是Future。它绝不是神奇的东西,它只是一个对象,您可以设置一个回调,在准备好某些结果时可以对其进行调用。

因此,您需要返回一个Future<bool>才能起作用。

Dart是单线程的。如果不使用隔离,则没有并发。取而代之的是,异步函数轮流工作,给其他代码运行时间,例如在它们等待将来时。如果您只执行do {} while (!completed);,则没有其他代码可以运行,这意味着将无法将completed设置为true。

答案 1 :(得分:1)

我是 dart 的新手,所以不确定这是否是正确的方法,但我已经通过在异步返回的 whenCompleted() 上使用函数 Future 解决了这个问题我正在调用的方法。

这里的 openDatabase 返回一个 Future

abstract class IBaseDatabaseHandler {
  Database sqliteDbHandler;

  IBaseDatabaseHandler.sqlite(String dataBasePath) {
    sqfliteFfiInit();

    var databaseFactory = databaseFactoryFfi;
    databaseFactory
        .openDatabase(dataBasePath)
        .whenComplete(() => sqliteDbHandler);
  }
}