Хобрук: Ваш путь к мастерству в программировании

Flutter: вопрос о фьючерсах и асинхронной функции

У меня есть несколько вопросов относительно использования фьючерсов в дротике. Скажем, я работаю с пожарным хранилищем, и у меня есть такая функция для обновления информации о пользователях:

void updateOldUser(User oldUser,String newInfo){
DocumentReference userToUpdateRef = userRef.document(oldUser.id);
Firestore.instance.runTransaction((Transaction transaction) async {
DocumentSnapshot userToUpdateSnapshot = await transaction.get(userToUpdateRef);
  if(userToUpdateSnapshot.exists){
    await transaction.update(
      userToUpdateSnapshot.reference, userToUpdateSnapshot.data[newInfo] + 1
    ).catchError((e)=> print(e));
  }
});

}

Мой вопрос: нужно ли возвращать будущее, поскольку runTransaction is Future. Кажется, он отлично работает и без него, но мне кажется, что он должен вернуть "Future void", чтобы иметь возможность ожидать updateOldUser, когда я его использую. Но когда я превращаю его в «Future void», а затем заканчиваю тело функции с помощью return; У меня есть сообщение об ошибке: «Ожидается значение после возврата». Но чего я действительно не понимаю, так это того, что с другим похожим кодом:

Future<void> updateUserPhoto(User user,File userPhoto) async {
String photoUrl = await  uploadImage(user.id,userPhoto);
DocumentReference userToUpdateRef = userRef.document(user.id);
Firestore.instance.runTransaction((Transaction transaction) async {
  DocumentSnapshot userToUpdateSnapshot = await transaction.get(userToUpdateRef);
  if(userToUpdateSnapshot.exists){
    await transaction.update(
      userToUpdateSnapshot.reference, {
      'photoUrl' : photoUrl
      }
    ).catchError((e)=> print(e));
  }
});
return;

}

Я не получаю эту ошибку, и она тоже работает нормально. Почему ? Заранее спасибо.


Ответы:


1

нужно ли возвращать будущее

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

Для функций "запустил и забыл" async вы можете использовать void, но это довольно необычно. Если тип возврата Future<...>, вызывающий может все же решить не ждать завершения.

Но когда я превращаю его в «Future void», а затем заканчиваю тело функции с помощью return;

Если вы используете async, в конце метода неявно возвращается Future.

Если вы не используете async, вам нужно вернуть Future лайк

return doSomething.then((v) => doSomethingElse());
28.02.2019
Новые материалы

Решения DBA Metrix
DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

Начало работы с Блум
Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

Создание кнопочного меню с использованием HTML, CSS и JavaScript
Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

Внедрите OAuth в свои веб-приложения для повышения безопасности
OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

Классы в JavaScript
class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

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

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