我想从这样的语音功能中解决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
,一切正常!为什么?
答案 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);