In simple words:
await
is meant to interrupt the process flow until the async
method has finished.
then
however does not interrupt the process flow (meaning the next instructions will be executed) but enables you to run code when the async
method is finished.
In your example, you cannot achieve what you want when you use then
because the code is not 'waiting' and the return
statement is processed and thus returns an empty list.
When you add the await
, you explicitly say: 'don't go further until my Future
method is completed (namely the then
part).
You could write your code as follows to achieve the same result using only 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 could also choose to use only the then
part, but you need to ensure that you call getExpensesByFundId
properly afterwards:
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) { /*...*/ });
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…