开发者问题收集

为什么 async/await 会产生不同的结果

2021-12-28
792

我只是在问这个问题,以澄清并对JavaScript承诺有更好的了解。以下两个代码看起来与我非常相似,但是为什么两者都给出不同的结果。还如何在 中获得 async/等待 功能的结果。然后 。谢谢。

异步/等待

907448101 075839675

。 >

358799517 714673325

async/等待 返回正确的名称和 。 /p>

2个回答

是的,这正是我们所期望的。

请记住, await 会有效地暂停执行,直到等待的操作完成。

在您使用 .then 的示例中,您会立即返回,因为您没有编写承诺链,以便仅在等待的操作序列完成时返回 response 。相反,您会立即返回 undefined 值,该值是初始化 response 时使用的

因此,通过 .then 表达您的逻辑(否则不变)的正确方法将是

 const getFieldValue = (collection, userid) => {
    let response;

    return firestore() // notice the return here! This is vital
      .collection(collection)
      .where("userid", "==", userid)
      .get()
      .then((querySnapshot) => {           
        querySnapshot.docs.find((doc) => {
          const { name } = doc.data();
          response = name;
        });
      })
      .then(() => response) // notice how we resolve our promise chain with the value ultimately assigned
      .catch((e) => console.log(e));
};
Aluan Haddad
2021-12-28

因为使用 async/await 时, 函数的执行被暂停(“暂停”),直到承诺得到解决 。因此,您的函数会等待结果。

但是,使用 .then 时,您的 函数将立即继续 执行 .then “块”下方的代码, 不会等待承诺得到解决 。因为响应在 .then 部分中设置之前就已返回,因此仍未定义。

使用 async/await 时,您必须想象 return 语句也在 .then 块中。

Georg Edlbauer
2021-12-28