Javascript 调用异步/等待函数并接收返回的值

Javascript 调用异步/等待函数并接收返回的值,javascript,ecmascript-6,promise,async-await,Javascript,Ecmascript 6,Promise,Async Await,我在API库中有一个函数,它调用firestore并返回数据。这部分很好: export const getUserByReferrerId = async id => { let doc = await firestore .collection(FIRESTORE_COLLECTIONS.USERS) .where('grsfId', '==', id) .get() .then(querySnapshot => { if

我在API库中有一个函数,它调用
firestore
并返回数据。这部分很好:

export const getUserByReferrerId = async id => {
  let doc = await firestore
    .collection(FIRESTORE_COLLECTIONS.USERS)
    .where('grsfId', '==', id)  
    .get()  
    .then(querySnapshot => {
      if (!querySnapshot.empty) {
        console.log ("we found a doc");
        // use only the first document, but there could be more
        const snapshot = querySnapshot.docs[0];
        console.log ("snapshot", snapshot.id);
        return snapshot.id  // uid of the user
      }
    });
}
我从一个组件调用这个库。我有另一个功能,只需点击按钮即可运行。我不知道如何从
async
api调用中获取值

我已尝试过此操作-当我
console.log
返回时,会出现一个承诺:

testCreditFunction = (id) => {
    let uid = getUserByReferrerId(id).then(doc => { 
        console.log("uid1", doc);    
    });
}
我也尝试过这个-日志显示
uid
为空

testCreditFunction = (id) => {
    let uid = '';
    
    (async () => {
        uid = await getUserByReferrerId(id);
        console.log ("uid in the function", uid);
    })();
}

这个问题我已经被问过好几次了,我试过好几个答案,但没有一个对我有用。奇怪的是,我在其他领域也做过同样的事情,但我不知道有什么区别。

我马上注意到一件事,就是你在混合
异步/wait
&
.then/.error
。虽然这并不是严格禁止的,但它肯定会让事情变得更加难以遵循

正如其他人在评论中提到的那样,您需要对“承诺解决”(完成)做出回报。下面是如何编写
getuserbyreferrid
(使用async/await)

const GetUserByReferrId=async id=>{
const usersRef=firestore.collection('users');
const query=usersRef.where('grsfId','=',id);
const snapshot=wait query.get();
if(snapshot.empty){
console.log(“未找到文档”);
返回;
}
console.log(“找到文档”);
const doc=snapshot.docs[0];//只使用第一个结果(可能还有更多)
退货单据id
}
您会注意到我是如何将查询构建步骤与快照请求分开的。这是有意为之的,因为其中唯一承诺的函数是
get
请求

使用这个
getUserByReferrId
可以通过一个简单的
wait
来完成。只需确保检查结果不是未定义的

const userID = await getUserByReferrerId('someid')

if (!userID) {
  console.log('user not found');
}

console.log(`User ID is ${userID}`);
  


p、 s-我建议将函数重命名为
getuseridbyreferrid
,以更准确地反映您返回的是一个ID而不是用户文档这一事实。或者,您可以返回user对象并保持名称不变。

我马上注意到的一件事是,您正在混合
async/wait
&
。然后/.error
。虽然这并不是严格禁止的,但它肯定会让事情变得更加难以遵循

正如其他人在评论中提到的那样,您需要对“承诺解决”(完成)做出回报。下面是如何编写
getuserbyreferrid
(使用async/await)

const GetUserByReferrId=async id=>{
const usersRef=firestore.collection('users');
const query=usersRef.where('grsfId','=',id);
const snapshot=wait query.get();
if(snapshot.empty){
console.log(“未找到文档”);
返回;
}
console.log(“找到文档”);
const doc=snapshot.docs[0];//只使用第一个结果(可能还有更多)
退货单据id
}
您会注意到我是如何将查询构建步骤与快照请求分开的。这是有意为之的,因为其中唯一承诺的函数是
get
请求

使用这个
getUserByReferrId
可以通过一个简单的
wait
来完成。只需确保检查结果不是未定义的

const userID = await getUserByReferrerId('someid')

if (!userID) {
  console.log('user not found');
}

console.log(`User ID is ${userID}`);
  


p、 s-我建议将函数重命名为
getuseridbyreferrid
,以更准确地反映您返回的是一个ID而不是用户文档这一事实。或者,您可以返回用户对象并保持名称不变。

将功能更改为此

export const getUserByReferrerId = async id => {
  return await firestore
  .collection(FIRESTORE_COLLECTIONS.USERS)
  .where('grsfId', '==', id)  
  .get();
}
尝试以这种方式获取数据

 testCreditFunction = (id) => {

 let querySnapshot = '';
        
    (async () => {
      querySnapshot = await getUserByReferrerId(id);
      const snapshot = querySnapshot.docs[0];
      console.log ("snapshot", snapshot.id);
  })();

把你的功能换成这个

export const getUserByReferrerId = async id => {
  return await firestore
  .collection(FIRESTORE_COLLECTIONS.USERS)
  .where('grsfId', '==', id)  
  .get();
}
尝试以这种方式获取数据

 testCreditFunction = (id) => {

 let querySnapshot = '';
        
    (async () => {
      querySnapshot = await getUserByReferrerId(id);
      const snapshot = querySnapshot.docs[0];
      console.log ("snapshot", snapshot.id);
  })();

您分配给
doc
,但不显示任何将
getuserbyreferrid
返回任何内容的代码。调用方要通过
等待
来“获取”某些内容,然后
,您需要在所有级别返回。您需要在
getUserByReferrId
方法中返回
doc
。现在它没有返回任何内容,这可能就是为什么返回的是承诺而不是值。您得到的是
promise
,因为函数是
async
,它有一个
wait
。这种情况发生时无需
返回任何内容。但是要得到一个值,您需要
返回该值。如果您返回一个值,您仍然会得到一个承诺,但是一个解析为该值的承诺(使用
。然后
等待
)的副本,并分配给
doc
,但不显示任何将
GetUserByReferrId
返回任何内容的代码。调用方要通过
等待
来“获取”某些内容,然后
,您需要在所有级别返回。您需要在
getUserByReferrId
方法中返回
doc
。现在它没有返回任何内容,这可能就是为什么返回的是承诺而不是值。您得到的是
promise
,因为函数是
async
,它有一个
wait
。这种情况发生时无需
返回任何内容。但是要得到一个值,您需要
返回该值。如果您返回一个值,您仍然会得到一个承诺,但是一个解析为该值的承诺(使用
。然后
等待
)的副本,非常感谢!我以前也尝试过类似的方法,但遇到了一个问题,它不喜欢呼叫区的等待。下面是按钮点击代码:{this.testCreditFunction(“q00mvn”)}>,下面是错误:./src/pages/components/UserReferralInfo.js第105行:解析错误:不能在异步函数103 | console.log(“在函数中”,id)104 |>105 | const userID=wait getuserbyreferrid('someid')我看到了问题——调用函数也需要异步:(async()=>{const userID=wait getuserbyreferrid(id)是的,我故意这么做了