等待多个级别的期货?

时间:2019-06-15 15:01:24

标签: flutter dart async-await future readability

我有一个SQFlite Database的单例实例的吸气剂,如下所示:

static Database _db;
static Future<Database> get db async {
    if( _db == null )
        _db = await openOrCreateDatabase();
    return _db;
}

现在,我想对db进行查询:

final List<Map<String, dynamic>> rows = await (await db).query(
    'mytable', 
    where: 'id<?', 
    whereArgs: [10]
);

我发现await (await db)很丑-是否有更好的方法将两个await串行“链接”在一起?

2 个答案:

答案 0 :(得分:0)

由于两个操作都返回一个Future,因此没有其他方法可以等待这两个操作。要一次等待多个期货,您需要将其添加到期货列表中,然后使用Future.wait,但在这种情况下通常更难看且无用。

      var futures = <Future>[];
      futures.add(operationThatReturnAFuture());
      futures.add(operationThatReturnAFuture());
      await Future.wait(futures);

Dart在等待之间不支持这种链接,但是我知道在这种情况下,这看起来很奇怪。

也许如果将变量行更改为方法,代码看起来会更简洁。

例如:

getUser(int id) async {
    final db = await database;
    var res = await  db.query("User", where: "id = ?", whereArgs: [id]);
    return res.isNotEmpty ? User.fromMap(res.first) : Null ;
  }

答案 1 :(得分:0)

一种替代方法是使用旧语法then()

Future getDb() => db;
Future makeQuery(db) => db.query(
    'mytable', 
    where: 'id<?', 
    whereArgs: [10]
);

void doSomethingWithQuery(query){}

getDb().then(makeQuery).then(doSomethingWithQuery);

代码自然以这种方式读取:“获取数据库,然后进行查询,然后执行其他操作”。我认为asyncgetDb()不需要makeQuery(db)关键字,但我可能是错的。

请注意,可以使用了解空值的get db运算符简化??=方法:

static Future<Database> get db async => _db ??= await openOrCreateDatabase();