Я люблю Дарт. Он мощный, как C # и Java, и в то же время не требует излишней многословности, как Python.

Но есть одна вещь, которую я действительно ненавижу в языке. То есть вы можете запускать асинхронный код, не дожидаясь его завершения.

Обновление: Как указывалось в комментариях, есть непредвиденный будущий ворс. Если вы включите, это как бы обойдёт всю проблему. Но, я имею в виду, это все равно раздражает, что не делает этого из коробки.

Обновление 2. Оказалось, что линт unawaited_futures работает только в том случае, если у вас есть будущее в другом будущем. Итак, это:

void foo() {
  someAsyncFunction();
}

Предупреждать не буду. Но это:

void foo() async {
  someAsyncFunction();
}

буду. Это снижает полезность ворса примерно на 50%. Вероятно, больше, потому что я не так часто использую асинхронный код. И, к сожалению, исходная проблема, описанная в этом посте, все еще остается в силе. Проблема описана в этом выпуске.



По общему мнению, эта проблема заключалась в том, чтобы ввести новый lint, avoid_async_from_sync, чтобы ловить, когда синхронный код вызывает асинхронный код. В этот пулреквест добавлен линт.



К сожалению, спустя 2 года он все еще «ожидает рассмотрения». Чувак, я думал, что мои запросы на включение требуют много времени, чтобы просмотреть.

Асинхронный код

Итак, я написал об async / await здесь:



Асинхронный код - это, как следует из названия, код, который выполняется отдельно от вашего основного кода. Это делается с помощью цикла событий. Так что никакой многопоточности здесь нет.

А так вы вызываете асинхронный код:

asyncFunction();

Теперь вы можете заметить, как вы вызываете обычную функцию.

Почему это проблема

Иногда вам может понадобиться запустить асинхронный код, и вам все равно, когда этот асинхронный код будет завершен. И в этих случаях это нормально.

Но в 99% случаев это не то, что вы хотите делать. Вы хотите дождаться завершения асинхронного кода. И для этого вам нужно:

await asyncFunction();

Но если в 99% случаев вы хотите это сделать, почему dart позволяет нам использовать обычный способ вызова асинхронного кода?

У меня было несколько ошибок, вызванных вызовом асинхронного кода, не дожидаясь его. И это легко сделать.

Это не похоже на гигантскую табличку с надписью «Эта функция асинхронная». Нет, чтобы знать, что вам нужно посмотреть на сигнатуру функции и увидеть, как она возвращает будущее.



Что я хочу

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

Я думаю, тебе нужно сделать что-то вроде runAsync(asyncFunction()). Это похоже на то, как в Unity, если вы хотите запустить сопрограмму, вам нужно пойти runCoroutine(coroutineFunction()).

А затем, когда вы захотите дождаться этого, вы можете сделать что-то вроде await runAsync(asyncFunction()). Нет, на самом деле синтаксис этого немного дряблый. Может лучше было бы сделать что-нибудь вроде runAsync(asyncFunction(), await: true).

Я думаю, это устранило бы большое количество ошибок, вызванных тем, что люди случайно запустили асинхронный код в обычном режиме.

Если вам понравился этот пост, не забудьте хлопнуть в ладоши и удерживать кнопку хлопка, пока не наберется число, которое вас устраивает. Да, я знаю, это похоже на обман, но это не так. Вот сколько я обычно хлопаю в ладоши:

0 - ›Не согласен / Не читал
1 -› Нейтрально, но жалко хлопну в ладоши
~ 4 - ›Не нравится все, но есть хорошие моменты
~ 16 - ›Это довольно хорошая статья
~ 50 -› Все должны прочитать это!