异步/等待无法正常工作

时间:2018-06-26 11:53:16

标签: javascript promise

我根据对Async / await及其工作方式的理解编写了此代码。基本上,我希望我的run()函数通过单击按钮和captcha函数等待set_captcha的值被设置,然后运行其余代码  

var captcha = false ;

function get_captcha() {
  return new Promise(function(resolve , reject ) {
    if(captcha === false ){
      reject(captcha );
    } else {
      resolve(captcha);
    }
  });
}

async function run() {
  var captcha = await get_captcha();
  console.log( ' captcha confirm -> ' + captcha );
}

run().then(function(){ console.log('done')});

function set_captcha(){
  captcha = 123;
}

</script>
<button type="button" onclick="set_captcha();">captcha</button>

但是很明显我错过了一些东西。当我运行代码时,我在控制台中收到此错误:

Uncaught (in promise) false

当我单击按钮并致电set_captcha()时,什么都没有发生。

1 个答案:

答案 0 :(得分:1)

您可以考虑异步/等待,更像是使用Promise的语法糖。

如果函数为async,则表示它始终返回promise。这就是为什么您只能在async方法中等待的原因-因为它始终保留在promise链中,所以可以在异步函数内返回值-但是,当您从该函数中返回某些内容时,它总是会再次保证

与promise一样-一旦进入promise链,您将无法在promiseChain之外获取值(就像您可以将其保存到某个全局变量中一样,但是您不能直接从链中返回值-您只能返回promise可以用一个值来解决)。

您可以重写任何异步函数以承诺链,反之亦然

此功能:

async function run() {
    var captcha = await get_captcha();
    console.log( ' captcha confirm -> ' + captcha );
}

等于这个:

function run() {
    return get_captcha().then(captcha => {
       console.log( ' captcha confirm -> ' + captcha );
    });
}

错误:开始时,验证码为false,因此您拒绝if(captcha === false ) reject(captcha );处的值为false的promise,但没有捕获到以Uncaught (in promise) false结尾的promise