Насколько ясно время ожидания в разных функциях NodeJS? - PullRequest
0 голосов
/ 03 марта 2020

Привет, у меня есть соединение с сокетом, и у меня есть рекурсивная функция с тайм-аутом, ожидающим ответа сокета, и когда я получил ответ, мне нужно отменить тайм-аут, как я могу это сделать?

Мой код:

...

var handshakeTimeout;

socket.on("newTrip", data => {
const {
  id: userId,
  trip: tripId,
  location: userLocation,
  socket,
  signalId
} = data;

usersOn.push({
  id: userId,
  socket: socket,
  signal: signalId
});

const refused = id => {
  sendToDriver();
};

const sendToDriver = () => {
  let driver = driversOn.find(
    e =>
      geolib.isPointWithinRadius(
        {
          latitude: Number(e.location.lat),
          longitude: Number(e.location.long)
        },
        {
          latitude: Number(userLocation.lat),
          longitude: Number(userLocation.long)
        },
        5000
      ) && e.status === "online"
  );

  if (!driver) {
    return setTimeout(() => sendToDriver(), 8000);
  } else {
    handshakeTimeout = setTimeout(() => refused(driver.id), 8000);

    io.to(driver.socket).emit("tripFound", { userId, tripId });
  }
};

sendToDriver();
});

socket.on("acceptTrip", data => {
const { id: driverId, car, location, userId } = data;
clearTimeout(handshakeTimeout);

let user = usersOn.find(e => e.id === userId);

if (user)
  return io
    .to(user.socket)
    .emit("driverFound", { driverId, car, location });
});

...

handshaketimeout - это таймер, но я не могу очистить его в событии сокета acceptTrip. таймер продолжает вызывать функцию «отказано».

...