Size: a a a

2020 November 25

🚀🚀

🚀🔬 🚀🔬🚀🔬... in ☄️ effector
🚀🔬 🚀🔬🚀🔬
кстати многое указывает на то, что открыть апи нужно именно к defered самого эффекта
кейсов вагон, от отмены запросов до нормальной реализации effector-reeffect
источник

🚀🚀

🚀🔬 🚀🔬🚀🔬... in ☄️ effector
Rafael 🦠
ааа не, второй вообще не самый простой вариант, потому что он может отметить все вызовы эффекта, а нужен только один
да нет, почему все
источник

🚀🚀

🚀🔬 🚀🔬🚀🔬... in ☄️ effector
один вызов — один defered
источник

🚀🚀

🚀🔬 🚀🔬🚀🔬... in ☄️ effector
в простейшем случае вообще достаточно обычного new Promise
источник

R

Rafael 🦠 in ☄️ effector
🚀🔬 🚀🔬🚀🔬
один вызов — один defered
у меня не самый простой кейс:

у меня стрим используется как longpuдд для получения инфы о статусе готовности отчета, отчет может формироваться до 15 минут

соответсвенно у меня есть механизм восстановление стрима на случай, если пользователь страничку перезапустил, поэтому эффект может запуститься как по кнопке, так и в init при восстановлении стрима

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

🚀🚀

🚀🔬 🚀🔬🚀🔬... in ☄️ effector
const abort = createEvent()

const fx = createEffect(({id}) => new Promise((rs, rj) => {
 const stop = abort.watch(abortId => {
   if (abortId === id) {
     stop()
     rj(Error('AbortError'))
   }
 })
 fn().then(
   val => {
     stop()
     rs(val)
   },
   err => {
     stop()
     rj(err)
   }
 )
}))
источник

🚀🚀

🚀🔬 🚀🔬🚀🔬... in ☄️ effector
единственное что нужно знать кнопке — id отменяемого запроса и то что нужно вызвать abort с ним
источник

🚀🚀

🚀🔬 🚀🔬🚀🔬... in ☄️ effector
если запрос всего один то и id не нужен
источник

🚀🚀

🚀🔬 🚀🔬🚀🔬... in ☄️ effector
данный кейс поддерживается даже в ssr, поддержка ватчей внутри эффектов сделана специально для этого
источник

R

Rafael 🦠 in ☄️ effector
🚀🔬 🚀🔬🚀🔬
const abort = createEvent()

const fx = createEffect(({id}) => new Promise((rs, rj) => {
 const stop = abort.watch(abortId => {
   if (abortId === id) {
     stop()
     rj(Error('AbortError'))
   }
 })
 fn().then(
   val => {
     stop()
     rs(val)
   },
   err => {
     stop()
     rj(err)
   }
 )
}))
это крутая реализация 🤔  мне очень нравится
источник

🦜

🦜 in ☄️ effector
Rafael 🦠
я почему спрашиваю, потому что у меня стоит задачка завести отмену эффекта (принудительно завершить один из grpc стримов)

так что если кто-то будет решать подобные задачки, то потом описывайте как-то свои сценарии хотябы
в проекте, на котором я был, как-то на уровне grpc отменились запросы
источник

🦜

🦜 in ☄️ effector
хз что там было настроено
источник

R

Rafael 🦠 in ☄️ effector
Да, там это есть
источник

R

Rafael 🦠 in ☄️ effector
Но этот метод нужно вызвать
источник

R

Rafael 🦠 in ☄️ effector
Извне
источник

🦜

🦜 in ☄️ effector
Rafael 🦠
Извне
может он в интерсепторах был
источник

🦜

🦜 in ☄️ effector
не знаю
источник

R

Rafael 🦠 in ☄️ effector
ну и плюсы у меня во вне grpc-web методы вообще не торчат
источник

R

Rafael 🦠 in ☄️ effector
я специально скрываю реализацию транспортного слоя
источник

ф

фильтруй мысли... in ☄️ effector
Rafael 🦠
я почему спрашиваю, потому что у меня стоит задачка завести отмену эффекта (принудительно завершить один из grpc стримов)

так что если кто-то будет решать подобные задачки, то потом описывайте как-то свои сценарии хотябы
я делал либу для отмены эффектов, но она больше заточена под fetch-запросы:
https://github.com/doasync/fry-fx
если использовать controller.onCancel то можно, в принципе, любой эффект отменять
источник