【问题标题】:how to wait for the completion of Future without 'async'如何在没有“异步”的情况下等待 Future 的完成
【发布时间】:2018-07-12 19:12:20
【问题描述】:

没有'async'和'futures'如何等待Future完成?

在我使用的库中,所有函数都是异步的。

// 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"

【问题讨论】:

  • 没有办法。最好解释一下您尝试使用 while 循环完成的内容。什么是“一切”?

标签: dart


【解决方案1】:

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

如果你需要等待未来,那么你的函数异步的。您需要立即返回某些内容,即使您还不知道结果。这就是Future 的含义。它在任何方面都不是神奇的,它只是一个对象,你可以设置一个回调,当一些结果准备好时,它会被调用。

因此,您需要返回 Future&lt;bool&gt; 才能使其正常工作。

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

【讨论】:

    【解决方案2】:

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

    这里openDatabase 返回一个Future

    abstract class IBaseDatabaseHandler {
      Database sqliteDbHandler;
    
      IBaseDatabaseHandler.sqlite(String dataBasePath) {
        sqfliteFfiInit();
    
        var databaseFactory = databaseFactoryFfi;
        databaseFactory
            .openDatabase(dataBasePath)
            .whenComplete(() => sqliteDbHandler);
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-07-22
      • 1970-01-01
      • 2019-04-10
      • 1970-01-01
      • 2017-09-30
      • 1970-01-01
      • 1970-01-01
      • 2013-11-16
      相关资源
      最近更新 更多