разрешение обещания внутри функции из другой функции - PullRequest
0 голосов
/ 10 января 2020

Я хочу разрешить функцию updateGuider из функции речи следующим образом:

tutor();

async function tutor(){
console.log('tutor function initiated..');
// wait until updateGuider function resolves
await updateGuider('default');
// The expected result is to reach this line after updateGuider resolves, but we can't so far!
console.log('Procccess Ends');


}
// Not working unless we use var instead of let?!
let updateGuiderResolve;

function updateGuider(state){    
  return new Promise((resolve) => { 
  updateGuiderResolve = resolve;
    switch(state) {
          case 'default':
          speak();
          break;         
    }
    
    });  
}


async function speak(){
   console.log('entered speak')
   setTimeout(function(){
     //after 5 seconds we resolve the updateGuider from speak function
     updateGuiderResolve();     
   },5000)
  
}  

Как видите, код не работает (ожидаемый результат - console.log('Procccess Ends') через 5 секунд);

Я заметил, что если я изменю let updateGuiderResolve на var updateGuiderResolve, все будет работать отлично! Почему?

1 Ответ

2 голосов
/ 10 января 2020

Проблема с let заключается (как следует из сообщения об ошибке), что вы пытаетесь использовать переменную до ее инициализации : вы звоните tutor() выше объявления let updateGuiderResolve; .

Но на самом деле вам вообще не нужна эта глобальная / stati c общая переменная для функции распознавателя. Вместо этого заставьте speak создать и вернуть само обещание:

async function tutor() {
  console.log('tutor function initiated..');
  await updateGuider('default');
  console.log('Procccess Ends');
}

async function updateGuider(state) {
  switch(state) {
     case 'default':
       return speak();   
  }
}

function speak() {
  console.log('entered speak')
  return new Promise(function(resolve) {
    setTimeout(resolve, 5000);
  });
}

tutor().catch(console.error);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...