Реагируйте на подписку на ответ многоадресной рассылки

#reactjs #react-native #race-condition #ssdp

Вопрос:

Я внедряю приложение для обнаружения устройств SSDP с использованием библиотеки react-native и react-native-ssdp. В основном то, что я делаю, это;

Многоадресная передача в сеть для устройств ssdp и их отображение на моем экране. Для того, чтобы сделать список;

У меня есть функция, которая регистрирует ответы ssdp. Каждый раз, когда мы получаем ответ от устройства, мы обновляем состояние, setDeviceList([...deviceList, newDevice]); но, поскольку устройства реагируют так быстро (менее половины секунды), возникает условие гонки, а затем обновление отсутствует в реальном списке. В этом случае я вижу только последнее отвечающее устройство в списке.

Как я могу это исправить ?

Ответ №1:

Я предполагаю, что вы использовали useState для списка устройств. Метод набора состояния использования может принимать прямой параметр или функцию, где входным параметром является текущее значение состояния. Так что вы можете попробовать что-то вроде этого:

   const [deviceList, setDeviceList] = useState([]) ...  setDeviceList((currentDeviceList) =gt; [...currentDeviceList, newDevice])   

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

Комментарии:

1. После этого вопрос отправил сообщение. Я нашел раздел функционального обновления в документации react ( жаль, что не видел его раньше) и сделал именно то, что вы предлагаете. Теперь его нет. !