Javascript-async wait不等待函数完成?

Javascript-async wait不等待函数完成?,javascript,async-await,es6-promise,Javascript,Async Await,Es6 Promise,我用async和await学习javascript,并自己尝试了一些示例,但似乎在从另一个函数(func2)调用异步函数(func1)时,func2不会等待func1完成其进程,它会跳转并继续执行…我的代码是否有问题,或者我是否应该将func2转换为异步并使用wait调用func1?如果是这样,是否意味着所有涉及异步等待方法的函数也需要变为异步? 这是我的原始代码 // func1 const func1 = async() => { try { await putCall

我用async和await学习javascript,并自己尝试了一些示例,但似乎在从另一个函数(func2)调用异步函数(func1)时,func2不会等待func1完成其进程,它会跳转并继续执行…我的代码是否有问题,或者我是否应该将func2转换为异步并使用wait调用func1?如果是这样,是否意味着所有涉及异步等待方法的函数也需要变为异步? 这是我的原始代码

// func1
const func1 = async() => {
   try {
     await putCallToServer(...);
     return 1;     // it returns as a promise
   } catch(ex) {
     return 2;
   }
}

// func2
const func2 = () => {
   let result = 0;
   result = func1(); // should I turn it into await func1()??
   console.log(result);  // log contains '0' instead of '1' or '2'
   return result;    // return as Promise but value inside is 0
}


如果我有一个func3调用func2,我是否也应该将func3转换为异步wait呢?

正如注释中所述,两个函数都必须是异步的才能使用wait。这可以在下面的代码片段中看到。(因为我不希望在示例中调用实际的服务器,所以我将抛出putCallToServer()。这将返回2的结果

我还将result更改为let变量,因为您试图mut一个常量,这是不允许的

异步函数putCallToServer(){
抛出“懒得犯真正的错误”
}
//职能1
常量func1=async()=>{
试一试{
等待putCallToServer();
return 1;//它作为承诺返回
}捕获(ex){
返回2;
}
}
//功能2
常量func2=async()=>{
设结果=0;
result=await func1();//是否应将其转换为await func1()??
console.log(result);//日志包含“0”而不是“1”或“2”
返回结果;//作为承诺返回,但其中的值为0
}

func2()
是的,您需要
等待func1()
。这意味着您必须使
func2
异步。另一种选择是使用承诺或回调。
async
wait
只是承诺的语法糖衣。在
const result=0
中不应该
be
定义一个常量,但不要重新赋值。如果不想更改将您的所有函数转换为异步函数。考虑不要在<代码>函数2> <代码>中调用异步,而是将解析结果< <代码>函数> <代码>作为参数。<代码>函数():(函数2)< /代码>,它允许您定义<代码>函数2> <代码>为<代码> const函数2=结果={控制台.log(结果);返回结果;}
await所做的一切都是暂停当前函数的执行,然后立即向调用者返回一个承诺。调用者必须对该承诺做些什么才能知道函数何时实际完成。如果调用者没有等待返回的承诺或没有使用
。然后()
若要知道何时完成,则调用者永远不会知道何时完成,也永远不会“等待”这就是
async/await
的工作方式。
await
暂停函数的执行,并立即向调用者返回一个承诺。
await
不会暂停整个解释器。谢谢!因此,如果我有一个func3将调用func2,我需要将func3设置为async并调用func2也在内部使用await?是的。为了使用await,您正在调用的函数和您正在进行调用的函数都需要是异步的。谢谢!在这里,我看到当您调用
fun2
,您只需执行
fun2
,而不是
await fun2
,我看到它一直在这样使用,但为什么呢?是因为
调用方
这是windows?或类似的
(async()=>wait func2())()