Javascript 解决未按预期工作的承诺

Javascript 解决未按预期工作的承诺,javascript,Javascript,我想使用async/await运行console.log('proccess-Ends')函数解析后的更新向导 类似下面的代码: tutor(); 异步函数tutor(){ console.log('tutor函数已启动..'); //等待updateGuider函数解析 等待更新向导(“默认”); //预期的结果是在updateGuider解析后到达这一行,但我们到目前为止还不能! console.log('proccess Ends'); } 函数更新向导(状态){ 返回新承诺((解析)=

我想使用async/await运行
console.log('proccess-Ends')函数解析后的更新向导

类似下面的代码:

tutor();
异步函数tutor(){
console.log('tutor函数已启动..');
//等待updateGuider函数解析
等待更新向导(“默认”);
//预期的结果是在updateGuider解析后到达这一行,但我们到目前为止还不能!
console.log('proccess Ends');
}
函数更新向导(状态){
返回新承诺((解析)=>{
如果(状态==“完成”){
log('updateGuider已解析!');
解决();
}
开关(状态){
“默认”情况:
说();
打破
}
});  
}
异步函数speak(){
setTimeout(函数(){
//5秒钟后,我们从speak函数解析updateGuider
updateGuider('done')
},5000)

}
每次调用updateGuider时,您都会返回不同的承诺。严格来说,您不能像这样解析UpdateGuide。另外,除非您在异步函数中等待某个内容,否则它不会执行任何操作,所以说,目前没有异步的理由。这并不完美,但你可以理解问题的要点


function updateGuider(state){    
  return new Promise((resolve) => { 

    if(state == 'done'){
       console.log('updateGuider has been resolved!');
       resolve();    
    }

    switch(state) {
          case 'default':
          speak(resolve);
          break;         
    }

    });  
}

function speak(resolve){

   setTimeout(function(){
      //after 5 seconds we resolve the updateGuider from speak function
      resolve()    
   },5000)

} 


每次调用updateGuider时,您都会返回不同的承诺。严格来说,您不能像这样解析UpdateGuide。另外,除非您在异步函数中等待某个内容,否则它不会执行任何操作,所以说,目前没有异步的理由。这并不完美,但你可以理解问题的要点


function updateGuider(state){    
  return new Promise((resolve) => { 

    if(state == 'done'){
       console.log('updateGuider has been resolved!');
       resolve();    
    }

    switch(state) {
          case 'default':
          speak(resolve);
          break;         
    }

    });  
}

function speak(resolve){

   setTimeout(function(){
      //after 5 seconds we resolve the updateGuider from speak function
      resolve()    
   },5000)

} 


我不确定您认为这段代码中发生了什么——您认为再次调用
speak
updateGuider
会解决最初返回的承诺或其他问题吗?我就是这么想的!如何从
speak
解析
updateGuider
??将解析函数传递给它?请解释一下。。。通过什么?你的问题是,当你可以在超时时间
updateGuider('done')
时,你正在创建一个新的承诺(而不是像你想象的那样,更新旧的承诺)。这可以通过在
updateGuider
函数中使用
speak(resolve)
来解决,将其更改为
function speak(resolve)
并调用
resolve()
而不是
updateGuider('done')
。这样你原来的承诺就会得到解决。我不确定你认为这段代码中发生了什么——你认为再次调用
speak
updateGuider
会解决原来返回的承诺吗?我就是这么想的!如何从
speak
解析
updateGuider
??将解析函数传递给它?请解释一下。。。通过什么?你的问题是,当你可以在超时时间
updateGuider('done')
时,你正在创建一个新的承诺(而不是像你想象的那样,更新旧的承诺)。这可以通过在
updateGuider
函数中使用
speak(resolve)
来解决,将其更改为
function speak(resolve)
并调用
resolve()
而不是
updateGuider('done')
。这样,您原来的承诺就会得到解决。您知道,每次调用updateGuider时,您都会返回一个新的承诺。让我强调一下这个新的关键词:)因此,如果你不把它称为inside speak,但你传递第一个promise的resolve方法,你就可以控制它。确切地说:1stPromise=newpromise((解析,拒绝)=>{…})2ndPromise=newpromise((解析,拒绝)=>{…})这两种解析方法是不同的。但是在任何承诺体中,您都可以将引用传递给它自己的解析方法,并随时调用它。这就是你打电话给speak(resolve)时所做的。你看,每次打电话给updateGuider,你都会返回一个新的承诺。让我强调一下这个新的关键词:)因此,如果你不把它称为inside speak,但你传递第一个promise的resolve方法,你就可以控制它。确切地说:1stPromise=newpromise((解析,拒绝)=>{…})2ndPromise=newpromise((解析,拒绝)=>{…})这两种解析方法是不同的。但是在任何承诺体中,您都可以将引用传递给它自己的解析方法,并随时调用它。这就是你打电话给speak(resolve)时所做的