rxdart ПоведениеSubject транзакция - PullRequest
0 голосов
/ 14 марта 2019

В FireBase мы можем сделать транзакцию, как это

final dataRef = database.reference().child('path/to/data');

dataRef.runTransaction((MutableData transaction) async{
    transaction.value = (transaction.value ?? 0) + 1;
    return transaction;
});

Интересно, у нас может быть то же самое с BehaviorSubject; как то так

final subject = new BehaviorSubject<int>();

subject.add(1);
subject.add(2);
subject.add(3);
subject.runTransaction((int currentData) => currentData + 2);
// or 
subject.add(subject.value + 2);

subject.stream.listen(print); // prints 7
subject.stream.listen(print); // prints 7

1 Ответ

0 голосов
/ 14 марта 2019

Я только что посмотрел, и кажется, что в настоящее время мы можем достичь этого.

  1. Во-первых, «Как только функция Dart начинает выполняться, она продолжает выполняться, пока не завершится. Другими словами, Функции Dart не могут быть прерваны другим кодом Dart. ", ref (за исключением того, что это большое EXCEPT await ключевое слово, даже если технически использовать awaitуже прервите и верните код в Future)

  2. Во-вторых, глядя на исходный код RxDart , оба add и setter являются синхронными (нетFuture, нет await), поэтому следующий код прост и гарантирует работу как транзакцию:

subject.add(subject.value + 2);
...