Асинхронное программирование в Dart (часть 1)

Асинхронное программирование в Dart (часть 1)

638

В данной серии статей я не буду касаться азов программирования на самом Dart, а коснусь вопросцев асинхронности в Dart.

Библиотеки Dart полны функций , которые возвращают Future либо Stream объекты. Эти функции асинхронны.

В документации читаем:

Future — подобен обещанию, когда-то в будущем предоставить итог.
Stream — это метод получить последовательность значений, таковых как, к примеру, последовательность событий (поток).

Future и Stream входят в библиотеку dart:async, которую можно применять, как в скриптах интернет-приложений, так и в скриптах, запускаемых из консоли.

Импортируем библиотеку так:

import ‘dart:async’;

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

Применять async и await
Он чрезвычайно похож на синхронный. Это, наверняка, самый обычный и понятный метод обработки future-объектов.

someFunction() async {
var someVar = await functionXXL();
if (someVar == someParam) {
// Делаем что-то. }
} } else {
// Делаем что-то.
В чем сущность await: await ждет возвращения результата асинхронной функции.

async функция (someFunction() — в нашем примере) практически возвращает сходу, до того, как выполнятся асинхронные операции снутри нее, но возвращает она Future, т.е. возвращает «обещание» вернуть определенные значения позднее, когда асинхронные процессы будут завершены.

Снутри функции с главным словом async мы можем запустить один либо несколько асинхронных действий. Иными словами конструкций await может быть много (пример из уникальной документации):

var entrypoint = await findEntrypoint();
var exitCode = await runExecutable(entrypoint, args);
await flushThenExit(exitCode);
} runUsingAsyncAwait() async {
//…
Принципиально направить внимание на последующее:

1. await работает лишь снутри тела функции, которое предварено главным словом async.
пока не выполнился один await управление не передается последующему. await конструкции выполняются в том же логическом порядке, как они написаны. Т.е. 2.
Раз мы не желаем, чтоб наша функция возвращала Future, можно применять разные решения для этого, к примеру, мы можем вызвать async функцию из иной (не async) функции. async функции постоянно возвращают Future. 3.

Сейчас давайте поглядим, как происходит обработка ошибок в async функциях:

someFunc() async {
// какая-то логика
try {
await someObject.start();
} catch (e) {
// управление ошибками
}
}
Используем способ Future — then()
Этот вариант имеет воплощение наиболее схожее на асинхронное. Разглядим на примере (пример из уникальной документации):

}); HttpRequest.getString(url).then((String result) {
print(result);
}).catchError((e) {
// Обрабатываем либо игнорируем ошибку.
В этом примере HttpRequest.getString(url) возвращает Future. Когда Future завершается, способ then() выпоняет некий код, в нашем случае выводит строчку в консоль. Обратите внимание на, что обработка ошибок в этом случае происходит в конструкции catchError.

Шаблон then().catchError() является сам по для себя асинхронной версией try-catch.

Способ then() возвращает Future, обеспечивая удачный метод пуска пары асинхронных функций в определенном порядке. Раз функция обратного вызова (callback), зарегистрированная в then(), возвращает Future, then() возвращает эквивалентный Future. Раз callback возвращает значение хоть какого другого типа, then() делает новейший Future, который завершается с сиим значением.

Снова пример из уникальной документации:

Future result = costlyQuery();

return result.then((value) => expensiveWork())
.then((value) => lengthyComputation())
.then((value) => print(‘done!’))
.catchError((exception) => print(‘DOH!’));
Тут мы лицезреем «сцепление» пары .then().

Функции в этом примере отрабатывают в последующем порядке:

costlyQuery() 1.
2. expensiveWork()
lengthyComputation() 3.

Используем способ Future.wait()
Пример: Раз нам необходимо выполнить несколько асинхронных функций, а по окончании их выполнения выполнить некий код, можно применять статический способ Future.wait().

Future func1 = doSmth1();
Future func2 = doSmth2();
Future func3 = doSmth3();;

Future.wait([func1, func2, func3])
.then((List values) {
print(‘Отработали!’);
});
Ссылки по теме
Асинхронное программирование Dart (eng): (ссылка1, ссылка2).
Также можно почитать: (ссылка3, ссылка4)

Спасибо за внимание. habrahabr.ru Я не гуру в Dart, потому буду чрезвычайно благодарен за ваши замечания, уточнения и предложения.