Javascript 调用异步/等待函数并接收返回的值
我在API库中有一个函数,它调用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
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)是的,我故意这么做了