В чем разница между актором и вызовом сервисов в xstate?

Я просто немного запутался в том, в чем разница между актерами и вызовом служб в xstate, поскольку для меня они выглядят одинаково.


person Jay-R Joseph Gabunada    schedule 12.03.2021    source источник


Ответы (2)


Самое простое объяснение состоит в том, что services привязаны к состоянию, в котором они находятся. Они запускаются и останавливаются, когда машина входит/существует в этом состоянии.

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

Пример: дочерняя машина как служба (запускается, когда машина переходит в состояние pending, и автоматически останавливается, когда машина находится в этом состоянии.

const parentMachine = Machine({
  id: 'parent',
  initial: 'pending',
  states: {
    pending: {
      invoke: {
        src: childMAchine
      }
    }
  }
});

Пример: дочерняя машина как актор, запущенная, когда машина входит в состояние waiting, живет в контексте как свойство localOne.

const parentMachine = Machine({
  id: 'parent',
  initial: 'waiting',
  context: {
    localOne: null
  },
  states: {
    waiting: {
      entry: assign({
        localOne: () => spawn(childMachine)
      })
    }
  }
});
person Ivan V.    schedule 23.03.2021

Вызванные сервисы являются порожденными акторами, которые оба являются акторами. Разница в том, как вы их создаете. Я буду использовать термины «актор» и «сервис» как взаимозаменяемые, но различать вызываемый актор/сервис и порожденный актор/сервис.

Когда машина переходит в состояние со свойством invoke, она создает службу. Вы должны заранее решить, сколько сервисов вы будете вызывать и какие именно сервисы вы хотите вызывать. Когда вы выходите из состояния с запущенными службами, вы больше не сможете с ними взаимодействовать, а в некоторых случаях (вызов машин, обратные вызовы, возвращающие функцию очистки) служба будет остановлена ​​и очищена. Ссылки на эти услуги хранятся внутри. Это хороший способ отправить запросы или добавить некоторые вычисления, от которых вы, возможно, захотите отказаться, или подождать, пока актор не закончит свою работу.

С помощью действия spawn вы можете создать любое количество актеров в любое время. Неизвестно, каких актеров вы создаете, но вам придется хранить ссылки на них в контексте. Вы также можете остановить любого из созданных актеров в любое время. Например, вы можете создать актера в одном состоянии и остановить его в каком-то другом состоянии при условном действии. Это полезно, когда вы хотите иметь систему, в которой вы можете создавать или останавливать актеров по требованию в любое время и не хотите быть привязанным к определенному состоянию.

Прочее что то - они одинаковые.

person Mr. Hedgehog    schedule 20.03.2021