在另一个函数中解析一个函数中的promise

时间:2020-01-09 21:40:22

标签: javascript promise

我想从这样的语音功能中解决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)
  
}  

您可以看到该代码无效(预期结果是5秒钟后将看到console.log('Procccess Ends'));

我注意到,如果将let updateGuiderResolve更改为var updateGuiderResolve,一切正常!为什么?

1 个答案:

答案 0 :(得分:2)

let的问题是(如错误消息所述)您是trying to use the variable before it has been initialised:您在tutor()声明上方调用let updateGuiderResolve;

但实际上,您完全不需要解析器功能的全局/静态共享变量。相反,让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);