ждать без объявления функции как асинхронной - PullRequest
0 голосов
/ 11 февраля 2019

На самом деле в Dart, чтобы использовать await в теле функции, нужно объявить всю функцию как async:

import "dart:async";

void main()  async {
  var x = await funcTwo();
  print(x);  
}

funcTwo() async {
  return 42;
}

Этот код не будет работать без маркировки main() какasync

Error: Unexpected token 'await'. 

Но, доктор говорит: «Выражения await оценивают e, а затем приостанавливает текущую функцию, пока результат не будет готов, то есть добудущее завершено "( Поддержка асинхронного языка Dart )

Итак, может быть, я что-то упускаю, но нет необходимости заставлять функцию быть асинхронной?Каково обоснование для того, чтобы сделать асинхронное объявление обязательным?

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Одна проблема заключается в том, что await изначально не был частью языка дартс.Чтобы поддерживать обратную совместимость с существующими программами, которые потенциально могут использовать await в качестве идентификатора, разработчики языка добавили механизм явного согласия на использование нового ключевого слова await: добавив (ранее недействительную) конструкцию для объявления функцииasync.

0 голосов
/ 11 февраля 2019

В async функциях await переписывается в код, в котором вместо await.

используется модификатор async, который обозначает такую ​​функцию как функцию, которую необходимо переписать, ис этим await поддерживается.

Без async вы должны написать

void main() {
  return funcTwo().then((x) {
    print(x);  
  });
}

Это очень простой пример, но переписывание может быть довольно сложным, когда используется больше асинхронных функций, например try/ catch, await for(...), ...

...