我知道if语句[duplicate]中JavaScript等待异步函数以及如何从异步调用返回响应的问题?,但是(也许是因为我是一个绝对的JS初学者(我无法实现这些想法。
使用async await文档,我可以使这个示例起作用:
let hello = async () => { return "Hello" };
hello().then((value) => console.log(value))
它只是输出Hello
。但是,我希望我的代码稍后检查函数hello
返回的内容。类似这样的东西:
if ( /* what comes here? */) {
console.log("Hello was said")
}
我怎么能这么做?如何制定这个if语句来检查CCD_ 3是否真的返回了";你好"?
hello().then((value) => ...)
基本上意味着,如果promise(await(实现了,它应该调用function(value = <return_value>){}
。。。所以…
hello().then((value) => {
if(value == 'Hello'){
console.log("Hello was said");
}
});
- async/Promise引入了一个独立的执行,否则会阻塞
- "稍后";发生在其阻塞线程完成时
- 您附加到.then((的回调将在"处执行;稍后的";时间
下面是一个可以消除一些雾的例子。
- 注意调用setFree((之后的两个独立线程
- gone((继续做自己的事情
- setFree((立即返回
- 两个执行之间共享一个公共变量waitOver
- then((处理程序"知道";并在";稍后的";时间
- 该处理程序更新公共变量waitOver,以通知那些有兴趣知道在";稍后的";时间
";
let waitOver = false;
let whatToDo = setFree("Jill",5);
console.log(whatToDo);
let theWait = setInterval( () => {
waitOver ? clearInterval(theWait) :
console.log(" and .. wait");
}, 1000);
function gone(secs) {
return new Promise(resolve => setTimeout(resolve, secs*1000));
}
function setFree(someone,secs) {
console.log(`If you truly love ${someone}, set ${someone} free`);
gone(secs).then(() => {
console.log(`Back! ${someone} is yours`);
waitOver = true;
return `${someone} is yours`;
}).catch(`Hunting ${someone} down and kill ${someone}`);
return " Here you wait ... ";
}
这就是你将得到的:
If you truly love Jill, set Jill free
Here I wait ...
and .. wait
and .. wait
and .. wait
and .. wait
Back! Jill is yours*
注意调用setFree((后,主执行线程中对waitOver的任何检查都将为false,除非该检查是在gone((由其.then((处理程序处理后进行的。
如果没有.then((处理程序,那么gone((会去树林里,你将永远不知道Jill是否回来了,即使她回来了,因为完成过程从未处理过:-(
这取决于你对"稍后";。
- 您可以将其保存为常规变量并导出(这不是异步等待的问题(导出变量
- 如果你想以一种安全的方式来做;稍后的";是在您需要将其发送到数据库之后的某一天
if语句可以封装在异步函数中,如下所示:
let hello = async () => { return "Hello" };
async function foobar() {
if(await hello() == 'Hello')
console.log('yay')
}
foobar()
await
只能在异步函数中使用。
Promise继续将Promise作为返回提供给您,但await可以在异步函数中评估Promise。