Я просто немного запутался в том, в чем разница между актерами и вызовом служб в xstate, поскольку для меня они выглядят одинаково.
В чем разница между актором и вызовом сервисов в xstate?
Ответы (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)
})
}
}
});
Вызванные сервисы являются порожденными акторами, которые оба являются акторами. Разница в том, как вы их создаете. Я буду использовать термины «актор» и «сервис» как взаимозаменяемые, но различать вызываемый актор/сервис и порожденный актор/сервис.
Когда машина переходит в состояние со свойством invoke
, она создает службу. Вы должны заранее решить, сколько сервисов вы будете вызывать и какие именно сервисы вы хотите вызывать. Когда вы выходите из состояния с запущенными службами, вы больше не сможете с ними взаимодействовать, а в некоторых случаях (вызов машин, обратные вызовы, возвращающие функцию очистки) служба будет остановлена и очищена. Ссылки на эти услуги хранятся внутри. Это хороший способ отправить запросы или добавить некоторые вычисления, от которых вы, возможно, захотите отказаться, или подождать, пока актор не закончит свою работу.
С помощью действия spawn
вы можете создать любое количество актеров в любое время. Неизвестно, каких актеров вы создаете, но вам придется хранить ссылки на них в контексте. Вы также можете остановить любого из созданных актеров в любое время. Например, вы можете создать актера в одном состоянии и остановить его в каком-то другом состоянии при условном действии. Это полезно, когда вы хотите иметь систему, в которой вы можете создавать или останавливать актеров по требованию в любое время и не хотите быть привязанным к определенному состоянию.
Прочее что то - они одинаковые.