Javascript JS中的异步/等待混淆
我在JS中学习异步,遇到了Async/Await。然后,我遇到了以下代码:Javascript JS中的异步/等待混淆,javascript,Javascript,我在JS中学习异步,遇到了Async/Await。然后,我遇到了以下代码: function scaryClown() { return new Promise(resolve => { setTimeout(() => { resolve('function scaryClown() { return new Promise(resolve => { setTimeout(() => { resolve('async fu
function scaryClown() {
return new Promise(resolve => {
setTimeout(() => {
resolve('function scaryClown() {
return new Promise(resolve => {
setTimeout(() => {
resolve('async function msg() {
const msg = await scaryClown();
console.log('Message:', msg);
}
function msg() {
scaryClown().then(msg => {
console.log('Message:', msg);
});
}
函数scarcylown(){
返回新承诺(解决=>{
设置超时(()=>{
解析('函数scarcylown(){
返回新承诺(解决=>{
设置超时(()=>{
解决('
wait解析承诺并返回解析值。所以上面的代码可以像下面那样编写。希望这能让您理解异步wait
情况就是这样:
当调用async
函数(即msg
)时,它会创建一个promise对象(我们称之为p),当它处理wait
表达式时会返回该对象。scaryClown()
执行,它设置计时器并返回另一个promise对象;我们将其称为Q。然后处理wait
:此时函数返回promise P。该promise此时未解析;它处于挂起状态
如果在调用msg()
之后有任何其他代码,则会像在任何函数调用之后一样执行。执行将继续,直到调用堆栈为空
然后,一段时间后,scarcylown()
调度的计时器事件将触发,相应的承诺Q将被解析。由于此承诺Q位于wait
表达式中,因此此解析将触发msg()的执行上下文的恢复
,其中wait
表达式现在计算为Q的解析值,即。"它不是返回未定义的
,而是使用return
关键字返回一个承诺,该承诺解析为。请注意,函数在满足wait
时已经返回。return
语句将稍后异步执行,并且仅用于解析函数的承诺on在执行时返回了await
@CertainPerformance,您好,“await scarlown();”也是如此return unwrapped hi Amit,so wait returns unwrapped wait解析您的承诺并将解析值赋给msg变量。因此,yes wait不返回承诺,它返回解析值。在您的情况下,joker emoji.ok Amit,最后一件事,如果msg常量包含joker emoji,那么我们调用msg()为什么函数,它会记录emoji。我的意思是,如果我们没有在异步函数中显式使用return,那么返回值是promise,解析为undefined?因此,当您通过添加async关键字使任何函数异步时,它会将该函数包装在promise中,并返回该promise。因此,如果您不从异步函数返回任何内容,那么n、 返回的承诺用undefined解析。您好,msg()返回undefined wrapped by promise是真的吗?异步函数消息不返回任何内容,在内部,它只是等待(等待)承诺从scaryClown函数解析,一旦解析(在您的情况下为2秒),vaiable msg将获取该值,然后将其记录在控制台中