Я не уверен, что полностью понимаю вопрос, но я бы предложил использовать синтаксис Dart async/await
, так как это облегчает чтение кода.
Например
main() async {
Rethinkdb rdb = new Rethinkdb();
try {
// get the connection
Connection conn = await rdb.connect(port: 28015);
// insert a row into the users table
await rdb.table('users').insert({'a': 'b'}).run(conn);
// query the users table
Cursor c = await rdb.table('users').run(conn);
// grab all the data from the cursor
List rows = await c.toList();
print(rows);
// close the connection
conn.close();
} catch (e) {
print('catching exception $e');
}
}
Вы можете создать класс для хранения соединения с базой данных, чтобы вам не нужно было его открывать и закрывать.
class Database {
Rethinkdb _rdb = new Rethinkdb();
Connection _conn;
connect(int port) async {
_conn = await _rdb.connect(port: port);
}
Future<List> fetch() async {
Cursor c = await _rdb.table('users').run(_conn);
return await c.toList();
}
close() {
_conn.close();
}
}
Кроме того, обработка ошибок драйвера может быть нарушена.
Драйвер выдает ошибку, когда он, вероятно, должен завершить Future с ошибкой, здесь:
}).catchError((err) => throw new RqlDriverError(
"Could not connect to $_host:$_port. Error $err"));
return _completer.future;
Это может стоить вопроса разработчикам пакетов. Вы заметите, что в моем main () выше исключение не перехватывается.