Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

234
Views
No se puede usar el estado de reacción dentro de un socketio en la función de devolución de llamada del evento

Estoy tratando de crear un componente donde, cuando agrega una tarea, se agrega un detector de eventos al cliente socketio. El evento se activa cuando el servidor informa el progreso de la tarea y quiero actualizar la tarea con el nuevo progreso.

El problema es que cuando actualizo el progreso de la tarea, la función de devolución de llamada del evento usa el estado del componente cuando se asignó la función. Si el estado de "tareas" estaba vacío antes de la asignación, la actualización de progreso borra el estado.

No sé cómo puedo usar el estado actual dentro de la función de devolución de llamada. (La actualización de progreso funciona fuera de la devolución de llamada del evento)

Aquí hay un ejemplo reproducible mínimo:

 import React, {useEffect, useRef, useState} from "react"; import axios from "axios"; import socketIOClient from "socket.io-client" export default function TestComponent() { const socketRef = useRef(null); const [tasks, setTasks] = useState([]) // task: {id, name, time_start, progress} useEffect(() => { if (socketRef.current == null) { socketRef.current = socketIOClient({path: "/api/socket.io"}); } return () => { socketRef.current.disconnect(); }; }, []); function addTask(task) { setTasks([...tasks, task]); addTaskProgressEvent(task); } function addTaskProgressEvent(task) { const event = "task:" + task.id + ":progress"; socketRef.current.on(event, (progress) => { // update task progress (this failes!) setTasks(tasks.map(list_task => list_task.id === task.id ? {...list_task, progress: progress} : list_task)) console.log(progress); }) } function handleStartTask() { axios.post("/api/task").then((response) => { addTask(response.data); }); } return ( <div className="TestComponent"> <button onClick={handleStartTask}> start task </button> </div> ); }
about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

Debe usar el setter con devolución de llamada para obtener el valor actual del estado:

 function addTaskProgressEvent(task) { const event = "task:" + task.id + ":progress"; socketRef.current.on(event, (progress) => { // update task progress (this failes!) setTasks(oldTasks => oldTasks.map(list_task => list_task.id === task.id ? {...list_task, progress: progress} : list_task)) console.log(progress); }) }
about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!