Samowywołujące się funkcje

0

Cześć

Mam taką funkcję, która wysyła na serwer wiadomości, lecz o nienznanej liczbie iteracji (jestem do tego zmuszony).

var transfering = false;

function wsUploadMessage() {
	if (transfering == true) {
		var messageContentValue = document.getElementById("message-content").value;
		socket.emit("uploading", messageContentValue);
		wsUploadMessage();
	}
}

To jest przycisk który, rozpoczyna wysyłanie danych:

$startTestButton.on("click", function() {
	transfering = true;
	wsUploadMessage();
});

No i chciałbym, żeby funkcja zakończyła się, gdy klient odbierze poniższe zdarzenie poprzez zmianę zmiennej transfering na false.

socket.on("current_test_score", function(data) {
	transfering = false;
});

Problem w tym, że funckcja wsUploadMessage() po odpaleniu pracuje w nieskończoność, tak jakby nie zwracał uwagi na to, że zmienna transfering zmieniła się na false.

Ma ktoś jakiś pomysł rozwiązania tego problemu?

2

tak jakby nie zwracał uwagi na to, że zmienna transfering zmieniła się na false.

Jako że JavaScript jest w całości uruchamiany na jednym wątku, Twoja zmienna nie zostaje magicznie zaktualizowana w tle (nie dajesz jej na to czasu); spróbuj tak:

function wsUploadMessage() {
    if (transfering) {
        var messageContentValue = document.getElementById("message-content").value;
        socket.emit("uploading", messageContentValue);
        setTimeout(wsUploadMessage, 0);
    }
}

Dzięki wykorzystaniu setTimeout() dajesz silnikowi JS chwilę na przetworzenie nadchodzących zdarzeń oraz uruchomienie event handlerów (poszukaj sobie materiałów w stylu js event loop explained).

1 użytkowników online, w tym zalogowanych: 0, gości: 1