С помощью RxDart генерировать несколько выходных событий для одного события при выполнении длинного списка асинхронных задач - PullRequest
0 голосов
/ 21 января 2019

Я хотел бы сделать что-то очень простое, но я очень новичок в мире Rx и у меня есть некоторые проблемы с переводом моей логики в код. Процесс такой:

  • пользователь имеет некоторый код и вводит его в приложение, Bloc.postCode (код) называется
  • этот код используется для множественных вызовов серверных API, а данные сохраняются в БД с использованием асинхронных вызовов через await, при каждом вызове я хотел бы опубликовать статус на Bloc.status.sink.add - это будет отображаться в приложении с помощью StreamBuilder

Мой текущий код:

class Bloc {
  final _code = PublishSubject<String>();
  final _status = BehaviorSubject<Status>();

  // stream
  Observable<Status> get status => _status.stream;

  // sink
  Function(String) get postCode => _code.sink.add;

  Bloc() {
    _code.stream
      .map(_processCode)
      .listen((status) => _status.sink.add(status));
  }

  _processCode(code) {
    // here I would like to do multiple http/db requests
    // and wait for end with await while posting status update 
    // to the user something like:
    // _status.sink.add(Status(status: 'RETRIEVING USERS'));
    // var users = await Api.GetUsers(code);
    // await DB.SaveUsers(users);
    // _status.sink.add(Status(status: 'RETRIEVING IMAGES'));        
    // var images = await Api.GetUsersImages(users);
    // _status.sink.add(Status(status: 'SAVING IMAGES'));        
    // images.forEach((image) => await FileUtils.SaveImage(image));

    return Status(status: 'DONE');
  }
}

Я не уверен, как мне решить эту проблему - какой будет лучший подход?

...