Дима
Один из которых является токеном для отмены другого
Дима
я считаю что отмена промиса это бред
Декларативная отмена промиса просто означает что результаты его выполнения нам больше не интересны
Sergey
как если const foo = getFoo()
Sergey
как отменить getFoo()
Sergey
что будет в foo?
Sergey
null?
Sergey
undefined?
Дима
Очень резонный вопрос, это действительно неоднозначно
Дима
Все по разному это расценивают
GG
что будет в foo?
этот асинк в итоге возратит промис, ну ииии ты уже просто отменяй конечный промисс, а не промежуточные
Дима
axios падает с CancellationError (на случай когда reject нежелателен там предусмотрен rejectInterceptor)
GG
отмени мне вызов обычной функции
а для чего такое делать?
Sergey
я когда-то писал такое: https://github.com/LestaD/timeout.js/blob/master/src/timeout.js
Sergey
а для чего такое делать?
так и я ж об этом
Дима
написал свою реализацию. Как думаете - норм? или какашка? https://repl.it/KUE8
https://medium.com/@benlesh/promise-cancellation-is-dead-long-live-promise-cancellation-c6601f1f5082 Я только вчера сидел изучал) Я сейчас как занимаюсь проблемой отмены асинхронных вызовов
Sergey
а для чего такое делать?
промисы это всего лишь временная прослойка для результата или ошибки
Mari
Пацаны, подскажите плз чатики iOSеров?
GG
так и я ж об этом
ну, мне надо, у меня в реакте setState делаеться по возращению результата промиса, а если пользоваетль демонтировал компонент, и пришел запрос, вот тут и нужно отменить промис
Sergey
как бы ты решал проблему?
GG
проверкой типа
Sergey
какого
Sergey
функцию calculateData нельзя отменить
Дима
GG
ну тогда все заблочиться, пока она не отработает 😅
Sergey
самое простое решение которое я вижу class Demo extends Component { mounted = false componentDidMount() { this.mounted = true getData().then(data => { if (this.mounted) this.setState({ data }) }) } componentWillUnmount() { this.mounted = false } }
Mari
Sergey
раз девелоперы решили выпилить isMounted
Sergey
отмена промиса это жесть
Дима
Фактически это cancellation token as it is
Sergey
костылить ради чего?
Sergey
зато явно
Sergey
но я бы заюзал flutures
Sergey
и код почище был бы везде
Anonymous
зато явно
А потом тебе надоест, и ты захочешь абстракцию.
Anonymous
И будет неявно. Хе-хе.
Дима
В futures кстати круто то, что ты явно задаёшь функцию для отмены
Дима
В результате фактически имеем деструктор для ресурсов
Anonymous
и я напишу HOC
HOC?.. Промис?.. Ээээ
Anonymous
А човаще надо было?
Sergey
чтобы не выполнился setState в .then если компонента больше нет
Anonymous
Рендерить чо-нить по событию?
GG
самое простое решение которое я вижу class Demo extends Component { mounted = false componentDidMount() { this.mounted = true getData().then(data => { if (this.mounted) this.setState({ data }) }) } componentWillUnmount() { this.mounted = false } }
мне мой вариант нравиться тем, что я сделал один раз ф-цию, прокидаваю туда промис и получаю возможность его отменять, в твоем же варианте, это в каждом компонентие нужно заводить переменную, писать componentWillUnmount, поэтому нельзя будет юзать компоненты функции, и блин в каждом компоненте писать это не айс, это не DRY
Дима
чтобы не выполнился setState в .then если компонента больше нет
Это кстати в хэндлерах recompose из коробки, что круто
Sergey
лол
GG
мой вар дешевле
Sergey
ну пиши)
Sergey
че спрашивать у сообщества
Anonymous
Дешевле рекомпоуз.
Дима
То есть, застряв в той же проблеме что сейчас Sergey, я обнаружил, что смена явной функции класса на хэндлер из recompose решает проблему
Anonymous
Сергей, вот тебе кратчайший путь.
Дима
имеешь ввиду withHandlers?
Да, они просто не вызываются если компонент уже отмонтирован
Дима
Ну это наверное от кейса зависит
Sergey
хотя может я че не так делал
Anonymous
Надо разковырять эту проблему только для того, чтобы разобраться, как работает, но это потом. А чтобы зарелизить фичу, бери рекомпоуз.
Sergey
Ну это наверное от кейса зависит
withState('name', 'setName', ''), withHandlers({ onClick: props => data => event => { props.setName(data.name) } }) <button onClick={props.onClick(item.name) /> чет мне кажется так не прокатит
Anonymous
withState('name', 'setName', ''), withHandlers({ onClick: ({ setName }) => data => event => { setName(data.name) } })
Anonymous
У тебя на момент обращения к setName же падает?
Anonymous
Типа её не существует?
Дима
так свалил же
А, точно Хз тогда короч
Anonymous
Я просто другого кейса не могу придумать.
Sergey
У тебя на момент обращения к setName же падает?
нет, пишет "компонента нет"
Anonymous
Хм.
Sergey
я в итоге написал hoc который разруливает всё сам