Флаттер несколько асинхронных методов для параллельного выполнения - PullRequest
0 голосов
/ 03 апреля 2019

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

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

import 'dart:async';

Future<String> firstAsync() async {
  await Future<String>.delayed(const Duration(seconds: 2));
  return "First!";
}

Future<String> secondAsync() async {
  await Future<String>.delayed(const Duration(seconds: 2));
  return "Second!";
}

Future<String> thirdAsync() async {
  await Future<String>.delayed(const Duration(seconds: 2));
  return "Third!";
}

void main() async {
  var f = await firstAsync();
  print(f);
  var s = await secondAsync();
  print(s);
  var t = await thirdAsync();
  print(t);
  print('done');
}

В этом примере каждый метод async вызывается один за другим, поэтому время выполнения основной функции составляет 6 секунд (3 x 2 секунды). Однако я не понимаю, в чем смысл асинхронной функции, если они выполняются одна за другой.

Функции async не должны выполняться в фоновом режиме? Разве это не смысл нескольких async функций для ускорения процесса с параллельным выполнением?

Я думаю, что мне чего-то не хватает в асинхронных функциях и шаблоне async / await во флаттере, поэтому, если бы вы могли объяснить мне это, это было бы очень признательно.

Лучший

Ответы [ 4 ]

1 голос
/ 22 июля 2019

Ожидание завершения нескольких фьючерсов с использованием Future.wait () Если порядок выполнения функций не важен, вы можете использовать Future.wait ().

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

Future
    .wait([firstAsync(), secondAsync(), thirdAsyncC()])
    .then((List responses) => chooseBestResponse(responses))
    .catchError((e) => handleError(e));

или async / await

try {
    List responses = await Future.wait([firstAsync(), secondAsync(), thirdAsyncC()]);
} catch (e) {
    handleError(e)
}

Если какая-либо из вызванных функций завершается с ошибкой, Futureвозвращается Future.wait () также завершается с ошибкой.Используйте catchError () для обработки ошибки.

Ресурс: https://v1 -dartlang-org.firebaseapp.com / tutorials / language / futures # ожидание-на-нескольких-фьючерсов-для-завершенияиспользуя-futurewait

0 голосов
/ 04 апреля 2019

я думаю, вы не поняли, как работает флаттер, первый флаттер не многопоточный .....! во-вторых, если он не многопоточный, как он может выполнять параллельные задачи, чего не происходит ....! Вот несколько ссылок, которые помогут вам понять больше https://webdev.dartlang.org/articles/performance/event-loop https://www.dartlang.org/tutorials/language/futures

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

0 голосов
/ 07 мая 2019

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

https://buildflutter.com/flutter-threading-isolates-future-async-and-await/

0 голосов
/ 03 апреля 2019

Использование async / await подобным образом полезно, когда вам требуется ресурс перед выполнением следующей задачи.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...