В ожидании нескольких уровней фьючерсов? - PullRequest
1 голос
/ 15 июня 2019

У меня есть геттер для одноэлементного экземпляра 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 вместе в последовательном?

1 Ответ

0 голосов
/ 15 июня 2019

Поскольку обе операции возвращают Future, для этих двух операций нет другого способа. Чтобы ожидать нескольких фьючерсов с одним ожиданием, вам нужно добавить его в список фьючерсов, а затем использовать Future.wait, но, как правило, в этом случае он более уродлив и бесполезен.

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

Дарт не поддерживает такого рода цепочку между await, но я понимаю, что в этом случае это выглядит странно.

Возможно, если вы измените переменные строки на метод, код будет выглядеть немного чище.

Например, что-то вроде:

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 ;
  }
...