Jak wykonać prostą operację zmiany w JavaScript z pomocą setInterval()?

0

Pytanie

Oto jak wygląda mój kod:

var fnInterval = setInterval(function() {
  let b = true
  if (b) {
    console.log("hi")
  } else {
    console.log("bye")
  }
  b = !b
}, 1000);

clearTimeout(fnInterval, 10000)

Jestem nowy w JavaScript, a moim celem jest to, aby rejestrować komunikat w konsoli co 1 sekundę łącznie przez okres 10 sekund, ale w ciągu każdego przedziału chcę, aby moje wiadomości переключалось pomiędzy "cześć" i "pa" . Jak mogę to zrobić? (w tej chwili wyświetla wartość logicznego wartości domyślne i później nie zmienia się)

javascript
2021-11-24 06:12:17
3

Najlepsza odpowiedź

0

Przesuń zmienną flaga z funkcji:

let b = true;

const fnInterval = setInterval(function() {
    if (b) {
        console.log("hi");
    } else {
        console.log("bye");
    }
    b = !b
}, 1000);

Aby zatrzymać minutnik przez 10000 milisekund, przenieś wyzwanie w clearInterval w setTimeout:

setTimeout(() => clearInterval(fnInterval), 10000);

Tymczasem należy pamiętać, że wartość zwracana setInterval nie jest to funkcja, a liczba, więc nazywanie jej może wprowadzić w błąd fnInterval.

2021-11-24 08:11:57
0

Przede wszystkim, należy zadeklarować let b = true poza funkcji wywołania zwrotnego. W przeciwnym razie ponownie zainicjowany przy każdym wywołaniu.

Po drugie, w 10000 clearTimeout(fnInterval, 10000) nie jest prawidłowym ustawieniem. clearTimeout(timeoutId) akceptuje tylko pierwszy parametr i natychmiast usuwa czas oczekiwania przekazana. Trzeba setTimeout aby uruchomić to przez 10 sekund, jeśli to jest twoim celem. Ale to powoduje, że stan wyścig między dwoma przekroczenia limitu czasu-niedokładność może oznaczać, że zauważysz jakieś logi lub uzyskaj więcej dzienniki.

Korzystanie z licznika-to jedno z rozwiązań, jak pokazują inne odpowiedzi, ale zazwyczaj, gdy używam trudny czas z setInterval do tego należy oczyścić go po pewnej ilości iteracji, ja рефакторирую do wspólnego obiecanego sleep funkcja oparta na setTimeout. To sprawia, że kod wywołujący znacznie czystsze (bez wywołań zwrotnych) i pozwala uniknąć kłopotów z clearTimeout.

Zamiast logicznego znaczenia dla zmiany flagi tam i z powrotem między dwoma wiadomości najlepszym rozwiązaniem jest użycie tablicy i moduł bieżącego indeksu na długości tablicy wiadomości. To znacznie ułatwia dodawanie większej ilości elementów, aby przełączać się między, a kod łatwiej zrozumieć, ponieważ stan niejawnie podano w liczniku.

const sleep = ms => new Promise(res => setInterval(res, ms));

(async () => {
  const messages = ["hi", "bye"];
  
  for (let i = 0; i < 10; i++) {
    console.log(messages[i%messages.length]);
    await sleep(1000);
  }
})();

2021-11-24 06:17:50
0

setInterval() zatrzymany clearInterval() nie clearTimeout(). Szczegóły skomentował w kodzie poniżej.

// Define a counter
let i = 0;
// Define interval function
const fnCount = setInterval(fnSwitch, 1000);

function fnSwitch() {
  // Increment counter
  i++;
  // if counter / 2 is 0 log 'HI'
  if (i % 2 === 0) {
    console.log(i + ' HI');
    // Otherwise log 'BYE'
  } else {
    console.log(i + ' BYE');
  }
  // If counter is 10 or greater run fnStop()
  if (i >= 10) {
    fnStop();
  }
};

function fnStop() {
  // Stop the interval function fnCount()
  clearInterval(fnCount);
};

2021-11-24 06:31:05

W innych językach

Ta strona jest w innych językach

Русский
..................................................................................................................
Italiano
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................