Próbuję zrobić dość prostą aplikację wiersza poleceń w węźle i chciałem spróbować dodać spinnera. Znalazłem pakiet ORA i mam kłopoty, aby ją pracować. Prawie każdy przykład, jaki mogę znaleźć użycie funkcji Setimeout w celu określenia, gdy spinner spinnuje, ale chciałbym mieć spinner, gdy uruchomiony jest długi blok kodu. Próbowałem to zrobić, używając zobowiązanej funkcji, ale nie jestem naprawdę pewien, czy to właściwa rzecz. Kiedy biegam coś z następującą formą, wirował pojawia się w wierszu poleceń, ale nie obraca się. Każda pomoc jest doceniana.

const ora = require('ora')

const spinner = ora('Doing something...').start()

function doSomething() {
  return new Promise( resolve => {
    // DO SOMETHING TIME-CONSUMING HERE
    resolve('Done')
  })
}

async function main() {
  await doSomething()
  spinner.stop()
}

main()
1
Mark Trupiano 21 kwiecień 2021, 02:34

1 odpowiedź

Najlepsza odpowiedź

Twój kod działa OK podczas korzystania z niektórych nie blokujących kodu w funkcji doSomething, np.:

function doSomething() {
  return new Promise( resolve => {
    setTimeout(() => resolve('Done'), 1000);
  })
}

Ale podejrzewam z twojego opisu i objawów, które opisujesz, że robisz coś, jak:

function doSomething() {
  return new Promise( resolve => {
    let i = 0;
    while (i++ < 1e10) {}
    resolve('Done');
  })
}

To rzeczywiście nie obróci spinner i to dlatego, że JS jest pojedynczy gwintowany i używa Spółdzielna wielofunkcyjna . Więc każdy wątek (myślą "funkcjonowanie"), które blokuje, blokuje również coś innego. Tak więc dobry obywatel w języku JS zawsze zwraca kontrolę i używa wywołania zwrotnego lub podobnego do oddzwonienia po zakończeniu.

1
Christian Fritz 20 kwiecień 2021, 23:50