Wpis z mikrobloga

#javascript #webdev #programowanie #frontend
W sumie nie używałem zbyt Promise. Stąd pytanie.

Mam takie coś:

event.target.removeEventListener("end", sayMeaining);

setTimeout(()=>{
msg = new SpeechSynthesisUtterance("yes, no, i don't no");
msg.lang = 'en-US';
window.speechSynthesis.speak(msg);
msg.addEventListener("end", speech);
}, delay*(1/3));

I to działa ale chcę to na Promises dać.
Tego jest kilka odczytów zdań, jedno po drugim, za każdym razem inne i czasem en-US a czasem pl-PL. Po odtworzeniu zdania event end musi być usunięty. Do tego to opóźnienie między wymowami.
Z tego się robi niezły bałagan bez Promises. Chociaż działa.

Jak zrobić wielostopniowe Promises? Tak, żeby jedno było za drugim?
  • 4
@look997:

```

const removeEvent = (event) => {
  // event.target.removeEventListener("end", sayMeaining);
  console.log('removing handler', event);
}
const createSpeach = (lang, delay) => {
  return new Promise((re, rj) => {
     re(setTimeout(() => {
       removeEvent('Ups.');
  //   msg = new SpeechSynthesisUtterance("yes, no, i don't no");
  //   msg.lang = lang;
  //   window.speechSynthesis.speak(msg);
  //   msg.addEventListener("end", speech);
       console.log(lang, delay);
     }, delay*(1/3)));
    }
  );
}
const fns = [
  createSpeach('en_US', 1000),
  createSpeach('pl_PL', 300),
  createSpeach('de_DE', 2000),
  createSpeach('pl_PL', 500),
];
fns.reduce((p, fn) => p.then(fn), Promise.resolve());
```

Pobaw się z tym.
@kmiasko: Pomyślałem sobie że to co mam działa, a to co proponujesz nie działa i wcale nie jest prostsze/przejrzystsze. Więc lepiej zostanę przy tym co jest.

No chyba że ktoś zaproponuje jakieś lepsze rozwiązanie. Chodzi o zwiększenie przejrzystości.

Marzyło mi się coś w rodzaju:
p
.then(()=>say("s1"))
.then(()=>say("s2"))
.then(()=>say("s3"))...
Ale może to tak się nie da, to tak nie działa? Nie literalnie tak ale coś w tym rodzaju.
@look997: nie wiem co tam dokładnie chcesz zrobić, bo we wklejonym kodzie brakuje chociażby tego, co oznacza speech...ale jeśli chcesz osiągnąć coś w stylu p1.then(p2).then(p3)... to zrób sobie funkcję:

var say = function(text) {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log(text);
resolve();
}, 1000);
});
};

say("text1").then(() => say("text2")).then(() => say("text3"));

Edit: nie wiem jak tu po ludzku wkleić kod, wykopowe metody coś nie działają...