在 Dart DOC 站點上,我看到了這個異步示例,
Future<void> printOrderMessage() async {
print('Awaiting user order...');
var order = await fetchUserOrder();
print('Your order is: $order');
}
Future<String> fetchUserOrder() {
return Future.delayed(const Duration(seconds: 4), () => 'Large Latte');
}
Future<void> main() async {
countSeconds(4);
await printOrderMessage();
}
void countSeconds(int s) {
for (var i = 1; i <= s; i ) {
Future.delayed(Duration(seconds: i), () => print(i));
}
}
// output
Awaiting user order...
1 // after 1 second
2 // after 2 second
3 //after 3 second
4 // after 4 second
Your order is: Large Latte // after 4 second
在我通過將 printOrderMessage() 和 main() 的回傳型別轉換為 void 并洗掉 main() 的 async 和 await 來更改代碼后,輸出相同的結果
printOrderMessage() async {
print('Awaiting user order...');
var order = await fetchUserOrder();
print('Your order is: $order');
}
Future<String> fetchUserOrder() {
return Future.delayed(const Duration(seconds: 4), () => 'Large Latte');
}
main() {
countSeconds(4);
printOrderMessage();
}
void countSeconds(int s) {
for (var i = 1; i <= s; i ) {
Future.delayed(Duration(seconds: i), () => print(i));
}
}
// 輸出
Awaiting user order...
1 // after 1 second
2 // after 2 second
3 //after 3 second
4 // after 4 second
Your order is: Large Latte // after 4 second
如果顯示相同的結果,為什么我們需要在 main() 中同步和等待并回傳 Future 型別?
uj5u.com熱心網友回復:
void對于回傳 null 的函式,該關鍵字是可選的。也是Future<void>。它們可以在不改變任何東西的情況下被移除。
await關鍵字將暫停異步函式的執行,直到等待的函式回傳。在您的示例printOrderMessage()中,位于main(). 是否等待它并不重要,因為在 printOrderMessage() 回傳后沒有其他代碼要執行。
如果printOrderMessage是 before countSeconds,await關鍵字將改變輸出:
main() async {
printOrderMessage();
countSeconds(4);
}
main() async {
await printOrderMessage();
countSeconds(4);
}
uj5u.com熱心網友回復:
你不需要async和await在你的main. 正如所寫,它沒有區別。
不忽略異步行為是一種很好的做法,使用async和await在這里強調異步實際上正在發生。
這個程式的行為無關緊要,因為 finalawait printOrderMessage();所做的只是從 接收一個未來printOrderMessage(),等待它完成,然后完成Future回傳的main(由于async)回傳的(它回傳是因為),null或者出現相同的錯誤,如果等待的未來以錯誤完成。沒有人等待由 回傳的未來main,因此任何值結果都將被忽略,任何錯誤都將成為未捕獲的異步錯誤。如果你只寫printOrderMessage();沒有await- 值被忽略并且錯誤未被捕獲,這完全相同。
如果有人有權訪問回傳的未來,main那么您會看到不同 -main未來將在沒有await, 而不是等待的情況下立即完成,并且不會出現相同的錯誤(它不能,因為它沒有等待它)。這很main特別,因為沒有人會查看其結果的一個函式,最好養成等待所有期貨的習慣,而不是擔心在方法中是否真的需要這樣main。
如果這await不是main函式的最后一個操作,它也很重要,因為它會await延遲之后的所有操作。在這里, 之后沒有任何內容await。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/321732.html
下一篇:你如何優化高總阻塞時間vue
