Я люблю Дарт. Он мощный, как 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 -› Все должны прочитать это!