Javascript 为什么在打印b之前先打印2和4?

Javascript 为什么在打印b之前先打印2和4?,javascript,node.js,concurrency,async-await,v8,Javascript,Node.js,Concurrency,Async Await,V8,函数优先(){ 返回新承诺(解决=>{ 控制台日志(2); 决心(3); 控制台日志(4); }); } 异步函数f(){ 控制台日志(1); 让r=先等待(); 控制台日志(r); 控制台日志(99); } console.log('a'); f(); console.log('b')检查这篇关于Promise参数的MDN文章 立即调用执行器函数,即同步调用 await基本上是等待承诺解决/拒绝,但是await语句之后的同步代码立即执行 类似地,进行f()调用,请注意,尽管async函数返回承

函数优先(){
返回新承诺(解决=>{
控制台日志(2);
决心(3);
控制台日志(4);
});
}
异步函数f(){
控制台日志(1);
让r=先等待();
控制台日志(r);
控制台日志(99);
}
console.log('a');
f();

console.log('b')检查这篇关于Promise参数的MDN文章

立即调用执行器函数,即同步调用

await
基本上是等待承诺解决/拒绝,但是
await
语句之后的同步代码立即执行

类似地,进行
f()
调用,请注意,尽管
async
函数返回承诺,但在
a
之后,控制台中立即有
1

如果你不明白,请留下评论。
谢谢。

我认为这确实发生了,请查看评论和数字

function first() {
  return new Promise(resolve => {
    console.log(2); // 5. Print "2"
    resolve(3); // 6. call resolve(3), meaning it will set the resolveCallback state of Promise with 3. 
    console.log(4); // 7. print "4"
  });
}

async function f() {
  console.log(1); // 3. Print "1"
  let r = await first(); // 4. Call the first() method and await the result, control goes to first() 
                        // 8. Since first() method updated the state of resolveCallback, it will assign "3" to variable "r" 
  console.log(r); // 10. print "3" 
  console.log(99); // 11. print "99"
}

console.log('a'); // 1. Start print 'a'
f(); // 2. Since funtion f() is decoreated with async key word it is by default return a promise and control goes to f()
console.log('b'); // 9. Since control release from f() print "b"
简单术语允诺允许您异步运行一些代码,然后在完成后运行其他代码,具体取决于结果(无论是失败还是成功)。它是使用构造函数模式创建的

签名:函数(resolveCallback,rejectCallback)


构造函数返回一个Promise对象,该对象跟踪它的状态,并且只能结算一次。这意味着解析程序和拒绝程序函数一起只能接收一个调用,并且状态不能从已解析更改为已拒绝,反之亦然。

等待表达式会导致异步函数执行暂停,直到承诺得到解决。一旦承诺得到满足或拒绝,然后它继续执行异步函数。同时,它将继续在异步函数之外执行代码。

好的,它需要深入理解javascript中的“任务和微任务执行”。 每个承诺都通过在每个任务结束时运行的微任务队列来处理

根据文档,微任务队列是在回调之后处理的,只要没有其他JavaScript在执行中,并且在每个任务结束时处理。在微任务期间排队的任何其他微任务都将添加到队列的末尾并进行处理

你可以在网站上找到最好的解释

如果您担心执行顺序,请在承诺范围内使用setTimeout。setTimeout为其回调安排了一个新任务,因此在此场景中,它将在当前任务之后运行

function first() {
  return new Promise(resolve => { setTimeout(()=>{
    console.log(2);
    resolve(3);
    console.log(4);
  }); });
}

async function f() {
  console.log(1);
  let r = await first();
  console.log(r);
  console.log(99);
}

console.log('a');
f();
console.log('b');


如果我们在setTimeOut内使用函数,该函数将放入等待块,但等待意味着下面的代码应该等待等待函数完成,所以等待将下面的所有代码推入等待块。感谢您的响应。这当然澄清了一些困惑。然而,我最大的困惑是输出
b
和2、4、b和3的顺序。你能详细阐述一下你的想法吗?这确实是一个很好的答案,并指出了我最大的困惑。但是,我仍然不清楚注释中的步骤7是如何在步骤6之后执行的,正如您在步骤6中所说,控件将转到
f()
。您能详细说明一下吗?这是因为您正在使用wait关键字调用first()方法。正如您可能知道的,wait关键字使JavaScript等待承诺返回结果。即使我们从first()方法调用resolve()方法,脚本仍将等待承诺返回。希望这有帮助。谢谢你的回复。我想我现在明白多了。根据我的理解,在#6处,控件不会直接转到
first()
,但它执行内存操作r=3并继续到7。我还认为将6和8的解释合并到6和7中更符合逻辑。讨论控制权转移到“console.log('b')的原因。其他答案很好地解释了这一点。在我看来,这样的回答将有助于将来像我这样的新手理解同样的问题。当然,我愿意接受,一旦修改,作为一个正确的答案:)。非常感谢你!可能重复的