Как реализовать async/await в Dart
Я думаю, что понимаю идею асинхронности, возвращающей будущее, но мне не ясно, как асинхронность ведет себя на самом базовом уровне. Насколько я понимаю, он не создает автоматически асинхронное поведение в программе. Например:
import 'dart:async';
main() {
a();
b();
}
a() {
new Timer(new Duration(milliseconds: 20), () {}); // create latency
print("a");
}
b() {
print("b");
}
// a
// b
Если вы ставите async после a(), b() сначала выполняется асинхронно, а a () выполняется после заданной задержки:
import 'dart:async';
main() {
a();
b();
}
a() **async** {
new Timer(new Duration(milliseconds: 20), () {}); // create latency
print("a");
}
b() {
print("b");
}
// b
// a
Но если вы ставите async после a () и b(), сначала выполняется a(), подобно тому, как вообще не используется async:
import 'dart:async';
main() {
a();
b();
}
a() **async** {
new Timer(new Duration(milliseconds: 20), () {}); // create latency
print("a");
}
b() **async** {
print("b");
}
//a
//b
Использует ли async для всех функций полную отмену асинхронной функции?
Теперь я думаю, что main () async фактически не активирует асинхронное поведение само по себе. Если вы добавите async после main(), ничего не изменится. Тем не менее, он позволяет вам использовать await, в случае, если вы должны дождаться завершения функции a(), прежде чем продолжить программу. Это правильно?
import 'dart:async';
main() **async** {
**await** a();
b();
}
a() **async** {
new Timer(new Duration(milliseconds: 20), () {}); // create latency
print("a");
}
b() {
print("b");
}
// waits for the value of a() if you put **await** keyword
// a
// b
Тем не менее, я вижу main () async {} alot, а также использую его после html-тега script, но нигде не ожидается. Означает ли это разные вещи в разных контекстах? Я надеюсь, что объяснил логику адекватно. Можете ли вы объяснить, как я неправильно понимаю использование async/await? Спасибо.
1 ответ
a() {
new Timer(new Duration(milliseconds: 20), () {}); // create latency
print("a");
}
Этот код не задерживает выполнение print("a");
в течение 20 мс Это просто задерживает выполнение {}
который поставлен в очередь для последующего исполнения, а затем сразу же продолжил с print("a");
Ваш код использует async
/ await
и эквивалентный код без async
/ await
будет выглядеть так:
import 'dart:async';
main() async {
await a();
b();
await main2(); // call the example without async/await
}
Future a() async {
await new Future.delayed(const Duration(milliseconds: 20), () {}); // create latency
print("a");
}
void b() {
print("b");
}
Future main2() {
return a2().then((_) {
b();
});
}
// equivalent of a without async/await
Future a2() {
return new Future.delayed(const Duration(milliseconds: 20), () {}) // create latency
.then((_) => print("a"));
}
Попробуйте на DartPad