为什么我的异步/等待功能异常?;(Javascript)

为什么我的异步/等待功能异常?;(Javascript),javascript,Javascript,这是我的Javascript代码。我想结果是12345 异步函数fn1(){ 控制台日志(1); 等待fn2(); 控制台日志(3); }; 异步函数fn2(){ 控制台日志(2); }; fn1(); 新承诺((解决、拒绝)=>{ 控制台日志(4) 解决() }).然后(()=>{ 控制台日志(5) }) //函数声明 异步函数fn1(){ 控制台日志(1); wait fn2();//等待异步函数fn2(在线程3上调度)=>所以console.log(2)应该按时间顺序在这里 控制台日志(

这是我的Javascript代码。我想结果是12345

异步函数fn1(){ 控制台日志(1); 等待fn2(); 控制台日志(3); }; 异步函数fn2(){ 控制台日志(2); }; fn1(); 新承诺((解决、拒绝)=>{ 控制台日志(4) 解决() }).然后(()=>{ 控制台日志(5) })
//函数声明
异步函数fn1(){
控制台日志(1);
wait fn2();//等待异步函数fn2(在线程3上调度)=>所以console.log(2)应该按时间顺序在这里
控制台日志(3);
};
异步函数fn2(){
控制台日志(2);
};
//线程1启动(实际执行代码)
fn1();//因为fn1是异步的,所以它在线程2上被调度
新承诺((解决、拒绝)=>{
控制台日志(4)
resolve()//触发器()=>{console.log(5)}
})//承诺声明
.然后(()=>{
控制台日志(5)

})//立即执行承诺
问题是JS代码本质上是异步的。因此,在执行“3”打印之前,它已经触发了其他指令,并且这些指令在该结束之前结束。

上述fn1()和new Promise()的执行是异步执行的,这就是指令顺序独立的原因。如果您希望获得所需的结果,可以尝试以下代码:

async function fn1 () {
    console.log(1);
    await fn2();
    console.log(3);
};

async function fn2 () {
    console.log(2);
};

async function makeExectionOrder(){ // move the blocks into asynch function
    await fn1(); // make synchrounous call
    new Promise((resolve, reject) => {
        console.log(4)
        resolve()
    }).then(() => {
        console.log(5)
    })

}

makeExectionOrder()

您必须了解堆栈和队列:

更多信息:堆栈和队列或

执行
newpromise(fnResolvingOrRejecting)
时,会立即调用函数
fnResolvingOrRejecting
,因此它位于同一堆栈上。还没有排队

如果您理解了什么是堆栈和队列,就可以更好地解释代码,省去令人困惑的异步和等待语法

一旦您了解了它的实际功能,语法将真正改善代码,但在本例中,我将省略它,以便您可以看到作为回调/结果处理程序执行的代码以及堆栈上的代码

function fn1 () {
  console.log(1);//on the same stack as calling fn1
  fn2()//executing fn2
  .then(//first queued
    () => console.log(3)
  );
};

function fn2 () {
  return new Promise(
    (resolve)=>{
      console.log(2);//on the same stack as calling fn1
      resolve();
    }
  );
};

fn1();//calling fn1 immediatly logs 1 and 2 because they are on the same stack
new Promise((resolve, reject) => {
  //after calling fn1 and queing console.log(3) this is executed because it's on
  //  the same stack
  console.log(4)
  resolve()
}).then(() => {//second queued
  console.log(5)
})

似乎console.log(3)在下一个刻度中。为什么“3”应该出现在“4”之前?我们使用async/await,以便解决异步问题。异步函数init(){//代码同上//但是await fn1()}init()如果我使用函数调用这些,我的结果是1 2 3 4 5。这是为什么?@XuYoung那只是因为你在等待执行
fn1()
之后才对
Promise
@XuYoung做任何事情。我编辑了我的评论。如果您在编辑之前看到了上一个,我的错误将导致混乱
await
仅在
async
函数中有效。因此,无论如何,如果执行
async function init(){//codes同上//但等待fn1()}init()
,线程1将等待
fn1()
(已调度到线程2)完成,这将使线程2中的
console.log(1)//(2) //在线程3中
将按时间顺序执行。谢谢。你太棒了!谢谢你的回复。我想再深入思考一下。异步声明的功能在微任务中吗?你可以只做
fn1()。然后()=>new Promise…console.log(4).
谢谢,非常有用。