我根据对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()
时,什么都没有发生。
答案 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