Как сделать синхронный вызов Dart синхронным?

Я собираюсь оценить Dart для немецкой компании, портируя различные программы Java на Dart, сравнивая и анализируя результаты. В браузере Дарт выигрывает руки вниз. Для производительности программного обеспечения сервера, казалось, серьезный вопрос (см.этот вопрос ко мне) но это в основном разрядилось.

Сейчас я нахожусь в области портирования некоторых «простых» инструментов командной строки, где я не ожидал каких-либо серьезных проблем, но есть хотя бы один. Некоторые из этих инструментов делают HTTP-запросы для сбора некоторых данных, и автономная виртуальная машина Dart поддерживает их только в асинхронном режиме. Просматривая все, что я мог найти, не представляется возможным использовать какой-либо асинхронный вызов в основном синхронном программном обеспечении.

Я понимаю, что мог бы реструктурировать доступное синхронное программное обеспечение в асинхронное. Но это превратит хорошо спроектированную часть программного обеспечения в нечто менее читаемое и более сложное для отладки и обслуживания. Для некоторых программ это просто не имеет смысла. Мой вопрос: есть ли (пропущенный мной) способ встроить асинхронный вызов в синхронно вызываемый метод?

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

Нечто похожее на это:

var synchFunction() {
  var result;
  asyncFunction().then(() { result = ...; });

  resync(); // the system call to move to and wait out all async execution

  return result;
}

Наличие такого метода также упростит API-интерфейсы lib. Большинство вызовов синхронизации могут быть удалены, потому что вызов повторной синхронизации сделает эту работу. Кажется, это настолько логичная идея, что я все еще думаю, что она как-то существует, и я пропустил это. Или есть серьезная причина, почему это не сработает?

Подумав о полученном ответе отlm (см. ниже) в течение двух дней я все еще не понимаю, почему инкапсуляция асинхронного вызова Dart в синхронный не должна быть возможной. Это делается в «нормальном» мире синхронного программирования все время. Обычно вы можете дождаться повторной синхронизации, либо получив «Done» из асинхронной подпрограммы, либо, если что-то не получится, продолжите работу после истечения времени ожидания.

Имея это в виду, мое первое предложение может быть улучшено следующим образом:

var synchFunction() {
  var result;
  asyncFunction()
    .then(() { result = ...; })
    .whenComplete(() { continueResync() }); // the "Done" message

  resync(timeout); // waiting with a timeout as maximum limit

  // Either we arrive here with the [result] filled in or a with a [TimeoutException].
  return result;
}

resync() делает то же самое, что обычно происходит после окончанияmain метод изолята, он запускает выполнение асинхронных функций из очереди (или ожидает событий, чтобы сделать их исполняемыми). Как только он встречаетcontinueResync() устанавливается флаг вызова, который останавливает это асинхронное выполнение иresync() возвращается в основной поток. Если нетcontinueResync() вызов встречается во время данногоtimeout период он тоже прерывает асинхронное выполнение и оставляетresync() сTimeoutException.

Для некоторых групп программного обеспечения, которые получают выгоду от прямого синхронного программирования (не клиентское программное обеспечение, а не серверное программное обеспечение), такая функция решит множество проблем для программиста, который имеет дело с асинхронными библиотеками только.

Я считаю, что я также нашел решение для основного аргумента вlmАргументация ниже. Поэтому мой вопрос остается в отношении этого «расширенного» решения, которое я предложил:Есть ли что-то, что действительно делает невозможным реализовать это в Dart?

Ответы на вопрос(1)

Ваш ответ на вопрос