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

Why async/await and then produce different results

我问这个问题只是为了澄清并更好地理解 javascript 承诺。下面两段代码和我看起来很像,但是为什么都给出了不同的结果。还有如何以 .then 的方式得到 async/await 函数的结果。谢谢。

async/await

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

  const querySnapshot = await firestore()
    .collection(collection)
    .where("userid", "==", userid)
    .get();
  querySnapshot.forEach((doc) => {
    const { name } = doc.data();
    response = name;
  });

  return response;
};
async function fetchData() {
  const name = await getFieldValue("Users", userid);
  console.log("name", name);
}
fetchData();

.然后

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

  firestore()
    .collection(collection)
    .where("userid", "==", userid)
    .get()
    .then((querySnapshot) => {
      querySnapshot.docs.find((doc) => {
        const { name } = doc.data();
        response = name;
      });
    })
    .catch((e) => console.log(e));

  return response;
};
const name = getFieldValue("Users", userid);
console.log("name", name);

async/await returns 正确的名字和 .then returns undefined

因为 async/await 函数的执行被暂停(“暂停”),直到 promise 被解析 .因此你的函数等待结果。

使用 .then 但是,您的 函数将立即继续 并使用 .then“块”下方的代码,不等待承诺解决。由于该响应在 .then 部分中设置之前 returned,因此仍未定义。

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

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

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

在您使用 .then 的示例中,您会立即 return 因为您没有编写您的承诺链,因此 response 仅在等待操作序列时才 returned完成。相反,您 return 立即使用初始化 responseundefined

因此,通过 .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));
};