Javascript 如何使异步变为同步

Javascript 如何使异步变为同步,javascript,async-await,Javascript,Async Await,我仍在试图弄清楚async/await是如何工作的 函数func1(){ console.log('a'); func2(); console.log('b'); } 异步函数func2(){ console.log('1'); 让value=等待新的承诺(resolve=>setTimeout(function(){resolve('async')},2000)); console.log(值) console.log('2'); } func1()无法将异步转换为同步 但是你可以得到你需要

我仍在试图弄清楚async/await是如何工作的

函数func1(){
console.log('a');
func2();
console.log('b');
}
异步函数func2(){
console.log('1');
让value=等待新的承诺(resolve=>setTimeout(function(){resolve('async')},2000));
console.log(值)
console.log('2');
}

func1()无法将异步转换为同步

但是你可以得到你需要的输出

使func1异步并使用wait

异步函数func1(){
console.log('a');
等待函数2();
console.log('b');
}
异步函数func2(){
console.log('1');
让value=等待新的承诺(resolve=>setTimeout(function(){resolve('async')},2000));
console.log(值)
console.log('2');
}

func1()同步意味着事情按时间顺序一个接一个地发生。 异步意味着事情在时间上相互独立

当您同步执行一项任务时,您会等待它完成,然后再继续执行另一项任务(一项接一项)

异步执行任务时,可以在前一个任务完成之前转移到另一个任务。但这不能完全保证

因此,在代码中,您在同步函数中调用了一个异步函数。所以,根据上面的解释,您不能保证在调用异步函数func2()后,将执行func1()的其余部分。因为func2()是一个异步函数,您不能说l完成其执行过程需要多少时间。所以,不能将异步变为同步

function func1() {
   console.log('a');
   func2(); // call a asyncronized method inside a syncronized method
   console.log('b');
}

async function func2() {
   console.log('1');
   let value = await new Promise(resolve => setTimeout(function() { resolve('async') } , 2000));
   console.log(value)
   console.log('2');
  }
func1();
但是您可以使用await关键字在func1()内调用异步函数func2(),因此同时func1()需要转换为异步函数才能使用await关键字。因此,通过这种方式可以生成所需的输出

// change func1() as async method
async function func1() {
   console.log('a');
   await func2(); // use await keyword
   console.log('b');
}

async function func2() {
   console.log('1');
   let value = await new Promise(resolve => setTimeout(function() {resolve('async') } , 2000));
   console.log(value)
  console.log('2');
}

func1();

我希望这能帮助您理解这个问题。

您不能将异步变为同步,因为这是不可能的-但是您可以获得所需的输出,您需要等待func2()
。因此,
func1
也必须变为异步。悲哀的是:(我需要重新思考我的代码..但是如果还有一个更高级别的函数,那么我需要一直向上..这个问题只是大致解释了我的问题..在我的情况下,我不能让所有的东西都变为异步:(我有一个函数将一些值存储为缓存,然后是一个函数以检索值列表,其中一个值是从一个函数(从我使用的库中)获取的,该函数以异步方式返回json结果。然后,它中断了我的所有其他代码:(@Neo-asynchrony就像一种病毒……它传播得很快……你无法战胜它,你需要学会如何使用它it@Neo“异步”表示该值将在以后某个时候可用。另一方面,同步代码现在就可以工作。是的,如果某个东西在以后某个时候可用,而其他东西依赖于它,那么它也必须等待,并且会一直向上扩散。是的,是的。我忘了它将被事件循环推到堆栈的末尾。@Neo不仅仅是这样。最重要的是pical async case是一个从服务器加载数据的网络请求。这可能需要几秒钟的时间,这对您的代码来说是一个永恒的等待时间。它不能只是阻塞,什么都不做,它仍然可以在网络请求运行时做很多事情(例如,对用户单击做出反应)。当网络响应返回时,它必须在那时处理它,依赖它的任何操作都必须在那时并且仅在那时继续。这就是异步执行模型。