Поток дерева состояний Mobx. Как узнать, когда это будет сделано?

Я использую дерево состояний mobx и mobx для UI Stuff.

Теперь, когда я что-то сохраняю в db, после выполнения запроса я хочу обновить пользовательский интерфейс (т.е. мое состояние mobx).

Мне нужно знать, когда поток закончится.

  myFlow: flow(function* () {
          // do stuff here.
    }),

теперь я вижу, что обещание возвращено, поэтому я подумал о том, чтобы просто сделать

myFlow.then() 

который работает, но мне интересно, является ли это способом свойства или есть другой способ сделать это (async / await? или какая-то внутренняя вещь, которая есть у потока?)


person chobo2    schedule 12.07.2018    source источник


Ответы (2)


поток возвращает обещание, поэтому работает любой механизм ожидания обещания: .then, await или yield внутри другого flow. Если вы хотите отобразить состояние потока, взгляните на mobxUtils.fromPromise(promise).case(....) пакета mobx-utils.

person mweststrate    schedule 21.07.2018
comment
Что вы имеете в виду, отображая состояние потока? Также, если я использую Axios и уступаю его. вернуть ответ, и он будет заключен в обещание по потоку? - person chobo2; 23.07.2018
comment
Поток сам по себе является обещанием, поэтому, если вы хотите отображать его состояние во время переходов между обещаниями, вам пригодится указанная выше утилита. - person mweststrate; 24.07.2018
comment
Вы можете дать все, что возвращает обещание, и поток будет его ждать. - person mweststrate; 24.07.2018
comment
но я должен ждать фактического метода потока? Я хочу что-то делать после того, как myFlow будет вызван и завершен. Я хочу либо зафиксировать ошибку и обновить пользовательский интерфейс, либо зафиксировать успех и обновить пользовательский интерфейс, но я хочу сделать это за пределами вызова потока. - person chobo2; 24.07.2018
comment
любой метод потока возвращает обещание. Так что вы можете дождаться этого, затем и т. Д.: myObject.myFlow().then(() => { console.log('done!') } - person mweststrate; 26.07.2018

Внутри генератора вы можете в конце вызвать другое действие.

В примере ниже я вызываю функцию thisIsWhatYouNeed. Эта функция будет вызываться при завершении работы генератора.

myFlow: flow(function* () {        
  try {
    const response = yield fetch('your URL here');
    const data = yield response.json()

    // here you can call another action
    self.thisIsWhatYouNeed(data);

  } catch (error) {
    console.log('error happens');
  }
})

thisIsWhatYouNeed(data) {
  // here you have your data and know that flow is finished
  console.log('generator already finished');
}
person Petr Lazarev    schedule 16.08.2018