простыми словами:
await
предназначено для прерывания потока процесса до завершения асинхронного метода.then
однако не прерывает поток процесса (то есть будут выполнены следующие инструкции), но позволяет запускать код после завершения асинхронного метода.
В вашем примере вы не можете достичь того, чего хотите, когда выиспользуйте then
, потому что код не «ждет», а оператор return
обрабатывается и, следовательно, возвращает пустой список.
Когда вы добавляете await
, вы явно говорите: «не уходите»далее, пока не будет завершен мой Future
(часть then
).
Вы можете написать свой код следующим образом, чтобы достичь того же результата только с await
:
Future<List<Expense>> getExpensesByFundId(int fundId) async {
Database db = await database;
List<Expense> expenseList = List();
List<Map<String,dynamic>> expList = await db.query(expTable,where: '$expTable.$expFundId = $fundId');
expList.forEach((Map<String, dynamic> expMap) {
expenseList.add(Expense.fromMap(expMap));
});
return expenseList;
}
YouМожно также выбрать использование только части then
, но вам необходимо убедиться, что впоследствии вы правильно вызвали getExpensesByFundId
:
Future<List<Expense>> getExpensesByFundId(int fundId) async {
Database db = await database;
List<Expense> expenseList = List();
return db.query(expTable,where: '$expTable.$expFundId = $fundId')
.then((List<Map<String,dynamic>> expList){
expList.forEach((Map<String, dynamic> expMap){
expenseList.add(Expense.fromMap(expMap));
});
});
}
// call either with an await
List<Expense> list = await getExpensesByFundId(1);
// or with a then (knowing that this will not interrupt the process flow and process the next instruction
getExpensesByFundId(1).then((List<Expense> l) { /*...*/ });