这个 async-await 方法调用究竟是如何工作的?这是正确的吗?

How exactly works this async-await method call? is it correct?

我不太喜欢 Angular 和异步编程,我有以下疑问。

进入服务class我有这个异步方法:

  async aestheticEvaluationExist(patientUID: string) {
    console.log("patientUID: ", patientUID);
    //return this.firestore.collection('aestetic-evaluation').doc(patientUID).get();   

    //const docRef = (await this.firestore.collection('aestetic-evaluation').doc(patientUID).);
    const exists: boolean = (await this.firestore.collection('aesthetic-evaluation').doc(patientUID).get().toPromise()).exists;

    console.log("aesteticEvaluationExist() exists: ", exists);

    return exists;
  }

然后进入我的组件class我有这个方法调用以前的服务方法::

let isUpdate = true;
(await this.patientService.aestheticEvaluationExist(this.patientUID)
                   .then(res => {
                                  console.log("RES: ", res);
                                  isUpdate = res;
                                }));

console.log("isUpdate: ", isUpdate); 

如您所见,它在方法调用之前有 awayt 关键字。

then() 中似乎工作正常(输出正确),我的 res 是错误的,当我在最后 console.log( ) line it print false,表示正确覆盖了原来的真值

我问如果这个 async 服务方法定义在方法调用上带有 await 关键字,它确保我的最后一个 console.log() 行在我的方法完成后执行。

我的理解对吗?或者为了确保正确的结果,我必须在 then()?

中执行最后一个操作

Is it my understanding correct?

不,您不能将 async / await.then() 语法结合使用,因为它们都试图完成相同的工作。

以下是等价的。

const myResult = await this.someAsyncFunction();
console.log(myResult);

this.someAsyncFunction().then(myResult => {console.log(myResult);});

所以在您的示例中,您需要执行以下操作

const isUpdate = await this.patientService.aestheticEvaluationExist(this.patientUID)
console.log("isUpdate: ", isUpdate); 

I am aksing if this async service method definition with the await keyword on the method call it ensure me that my last console.log() line is executed after that my method completed.

是的,大致如此。 async/await 是创建和使用承诺的语法。 async 函数 returns 承诺。当 async 函数中的代码到达第一个 await 时,函数 returns 它的承诺,等待代码使用 await 上的内容,然后继续执行该函数逻辑,最终确定 async 函数返回的承诺。

所以函数的逻辑不会进展到 console.log,直到你 await 的承诺得到解决。


请注意,很少有理由将对 thencatch 等承诺方法的显式调用与 async/await 语法结合起来。使用一个或另一个。 (也不需要将 await 运算符和操作数包装在 () 中。)在这种情况下,您可以替换为:

let isUpdate = true;
(await this.patientService.aestheticEvaluationExist(this.patientUID)
    .then(res => {
        console.log("RES: ", res);
        isUpdate = res;
    }));
console.log("isUpdate: ", isUpdate); 

let isUpdate = true;
const res = await this.patientService.aestheticEvaluationExist(this.patientUID);
console.log("RES: ", res);
isUpdate = res;
console.log("isUpdate: ", isUpdate); 

甚至可能

let isUpdate = await this.patientService.aestheticEvaluationExist(this.patientUID);
console.log("isUpdate: ", isUpdate);