我不太了解 await/async 機制(在 dart 中,但我猜這個問題實際上與任何語言都相關)。我正在使用 sqfentity 庫來管理一個小型資料庫。
這個庫提供了一個 select().toList() 函式,它將查詢一些 DB 行并將其作為物件串列回傳。
回傳的函式實際上是回傳一個 Future<List> 允許異步運行查詢。
我正在使用本地資料庫,所以我并不真正關心訪問時間問題,所以我想撰寫一個回傳串列的函式,一旦查詢完成:
List<Event> get_list() async{
return await Event()
.select()
.toList()
}
問題是異步函式必須回傳 Future<> 物件。但是,如果我理解得很好, await 將“等待” toList() 函式在回傳之前完成,所以我不明白為什么我不能只回傳 List 物件。
為了做好我的作業,我使用了在dart中,引數是通過參考傳遞的,所以我寫了一些中間函式
void fillList(List<Event> lst){
lst.addAll(await Event()
.select()
.toList())
}
List<Event> get_list() {
List<Event> lst;
fillList(lst);
return lst;
}
這似乎真的不自然,而且可能是一種錯誤的做事方式。關于如何處理 dart 中的 await 的任何解釋?
謝謝!
uj5u.com熱心網友回復:
我不太確定我是否理解了這個問題,但這取決于Event().select();. 如果它回傳 a Future,那么您需要使用 async/await 組合或then回呼。否則,您可以直接回傳一個串列Event。
您還可以執行以下操作:
List<Event> get_list(){
final List<Event> events = [];
// If Event().select() returns a Future
Event()
.select().then((result){
events.addAll(result.toList());
});
return events;
}
但是這樣做的問題是,當Event().select()仍在加載時,該函式將回傳一個空串列,然后在加載專案時,該函式將回傳并用回傳的專案填充串列。這就是為什么這樣的事情:
Future<List<Event>> get_list() async{
final events = await Event().select();
return events.toList();
}
有點更好,因為如果您想在加載專案時顯示微調器,您可以這樣做,也可以輕松捕獲錯誤。
uj5u.com熱心網友回復:
但是,如果我理解得很好, await 將“等待” toList() 函式在回傳之前完成,所以我不明白為什么我不能只回傳 List 物件。
當你這樣做時:
Future<Result> foo() async {
var intermediateResult = await someAsynchronousOperation();
var result = doOtherStuff(intermediateResult);
...
return result;
}
await提供暫停執行foo直到someAsynchronousOperation()完成的外觀。它不會暫停您的整個程式。異步操作的要點是允許程式的其余部分在您等待它完成時繼續執行。這允許您的程式繼續回應用戶輸入。
每當您使用await時,它實際上是回傳 a 的語法糖Future:
Future<Result> foo() {
return someAsynchronousOperation().then((someIntermediateResult) {
var result = doOtherStuff(intermediateResult);
...
return result;
});
}
foo()呼叫someAsynchronousOperation()(它本身回傳 a Future),在其上注冊一個.then()完成回呼以便doSomeOtherStuff()稍后執行。 foo()然后立即將結果回傳Future給它自己的呼叫者。
void fillList(List<Event> lst){ lst.addAll(await Event() .select() .toList()) } List<Event> get_list() { List<Event> lst; fillList(lst); return lst; }
這是行不通的。
await只能在用 . 宣告的函式中使用async。- 因為
fillList依賴于 aFuture,所以它本質上是異步的。但是,通過宣告它回傳void而不是 aFuture,呼叫者不可能在fillList完成時得到通知。 - 一旦你修復
fillList了回傳一個Future,get_list需要等待它Future完成后再回傳lst。由于get_list需要依賴 aFuture,它本身也是異步的。(異步函式具有傳染性。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/449862.html
