Jak mohu provést jednoduché přepínání provozu v jazyce JavaScript s pomocí setInterval()?

0

Otázka

To je to, co můj kód vypadá takto:

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

clearTimeout(fnInterval, 10000)

Jsem nováček v Javascriptu a mým cílem zde je, aby konzole log zprávu, každou 1 sekundu po dobu 10 sekund, ale během každého intervalu chci, aby moje zprávy přepínat její hodnotu mezi "ahoj" a "sbohem" . Jak mohu udělat to? (jako nyní zobrazuje hodnotu pro výchozí boolean a nemění později)

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

Nejlepší odpověď

0

Pohyb vlajky proměnné z funkce:

let b = true;

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

K zastavení časovače po 10000 milisekund, zabalit volání clearInterval v setTimeout:

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

Mezitím, všimněte si, že vrácená hodnota setInterval není funkce, ale číslo, takže to může být zavádějící říkat fnInterval.

2021-11-24 08:11:57
0

Za prvé, prohlásit let b = true mimo funkci zpětného volání. To je re-inicializaci na každé volání jinak.

Za druhé, 10000, v clearTimeout(fnInterval, 10000) není platný parametr. clearTimeout(timeoutId) přijímá pouze první parametr a vymaže časový limit prošel okamžitě. Potřebujete setTimeout aktivuje po 10 sekundách, pokud je to váš cíl. Ale to způsobí, že spor mezi dvěma timeouty -- nepřesnost může znamenat, že budete chybět některé deníky nebo skončit s další protokoly.

Pomocí čítače je jedním z řešení, jako další odpovědi ukazují, ale obvykle, když jsem pomocí komplexní načasování s setInterval to vyžaduje vymazání po určitém počtu iterací, jsem refaktorovat, aby obecný promisified sleep funkce založené na setTimeout. To udržuje volající kód mnohem čistší (žádné volání) a vyhýbá se probírat s clearTimeout.

Místo boolean flip vlajku tam a zpět mezi dvěma zprávami, lepším řešením je použít pole a modulo aktuální index do zprávy délka pole. To dělá to mnohem jednodušší přidat více položek, které chcete procházet a kód je srozumitelnější, protože stát je implicitní v pultu.

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() je zastavila clearInterval() ne clearTimeout(). Podrobnosti jsou komentovány v kódu níže.

// 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

V jiných jazycích

Tato stránka je v jiných jazycích

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