Ako môžem vykonať jednoduché prepínanie prevádzky v Javascripte pomocou setInterval()?

0

Otázka

To je to, čo môj kód vyzerá takto:

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

clearTimeout(fnInterval, 10000)

Som nováčik na JavaScript a mojím cieľom je tu console log správy za 1 sekundu pre celkovej dĺžke 10 sekúnd, ale počas každého intervalu chcem, aby moje správy ak chcete prepnúť svoju hodnotu medzi "hi" a "bye" . Ako môžem to urobiť? (ako teraz zobrazuje hodnoty pre štandardné boolean a nie je neskôr zmeniť)

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

Najlepšiu odpoveď

0

Presuňte vlajka premennej z funkciu:

let b = true;

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

Ak chcete zastaviť odpočítavanie po 10000 milisekúnd, zábal volanie clearInterval v setTimeout:

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

Medzitým, na vedomie, že návratová hodnota setInterval nie je funkcia, ale číslo, tak to môže byť zavádzajúce, ak chcete volať to fnInterval.

2021-11-24 08:11:57
0

Po prvé, vyhlasujem, let b = true mimo callback funkcie. Je to re-inicializovaný na každý hovor inak.

Po druhé, 10000 v clearTimeout(fnInterval, 10000) nie je platný parameter. clearTimeout(timeoutId) akceptuje len prvý parameter a vymaže timeout prešiel okamžite. By ste potrebovať setTimeout na spustenie tohto po 10 sekundách, ak je to váš cieľ. Ale, že spôsobuje rasy stave medzi dve časové limity, -- imprecision môže znamenať, že budete chýbať niektoré denníky alebo natahovat s možnosťou denníky.

Pomocou počítadla je jedným z riešení, ako ostatné odpovede show, ale zvyčajne, keď som pomocou zložitých načasovanie s setInterval že vyžaduje ich vymazanie po určitý počet iterácie, som refactor na všeobecné promisified sleep funkcie založené na setTimeout. To vedie predvoľba oveľa čistejšie (č volania) a vyhýba sa umazávání s clearTimeout.

Namiesto boolean flip vlajku a späť medzi dvoma správy, lepším riešením je použiť pole a modul aktuálny index podľa správy pole dĺžky. Je to oveľa jednoduchšie, ak chcete pridať ďalšie položky na prechádzanie a kód je ľahšie pochopiť, keďže štát je implicitný v protismere.

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 zastavené clearInterval() nie clearTimeout(). Podrobnosti sú komentované v kód nižšie.

// 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 iných jazykoch

Táto stránka je v iných jazykoch

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