我调用了一个异步函数,并将用户id列表作为参数传递。该函数查询firestore以在该迭代中获取用户id的令牌。
async function getTokensForUsers(ids) {
const promises = ids.map(async (id) => {
console.log("Querying for user with id: " + id);
const querySnapshot = await db.collection('users').where('deviceUid', '==', id).get();
return querySnapshot.docs.map(doc => doc.data().deviceToken);
});
let tokens = await Promise.all(promises);
return tokens.flat();
}
方法如下:
const ids = await getIdsOfUsersWithName(name);
console.log("Getting tokens for users" + ids);
const tokens = await getTokensForUsers(ids);
console.log("Tokens" + tokens)
当最终的console.log()
打印时,它打印为"Tokens,,,,,"当我可以在集合中看到数据时,这表明它没有从Promise返回数据。
我已经从您提供的代码中重新创建了这个问题,并获得了预期的结果。我已经尝试了firebase V9(模块化)和firebase V8(命名空间)。
这个问题似乎使deviceToken
字段在firestore数据库集合中为空。我建议你修改这一行
return querySnapshot.docs.map(doc => doc.data().deviceToken);
const data = querySnapshot.docs.map((doc) => doc.data().deviceToken);
console.log(data);
return data;
这将显示从每个文档的doc.data().deviceToken
返回的内容,并且正如您提到的,您将获得"令牌,,,,,"这意味着你可能会得到这样的内容:
[ '' ]
[ '' ]
[ '' ]
[ '' ]
[ '' ]
Tokens,,,,
看起来您的deviceToken
字段是空的。下面是我成功工作的代码:
// Initialize Firebase
firebase.initializeApp(firebaseConfig);
const db = firebase.firestore();
async function getTokensForUsers(ids) {
const promises = ids.map(async (id) => {
console.log("Querying for user with id: " + id);
const querySnapshot = await db
.collection("users")
.where("deviceUid", "==", id)
.get();
const data = querySnapshot.docs.map((doc) => doc.data().deviceToken);
console.log(data);
return data;
});
let tokens = await Promise.all(promises);
return tokens.flat();
}
const name = "rohit";
async function fire() {
const ids = await getIdsOfUsersWithName(name);
console.log("Getting tokens for users: " + ids);
const tokens = await getTokensForUsers(ids);
console.log("Tokens" + tokens);
}
async function getIdsOfUsersWithName(name) { //assumed
const querySnapshot = await db
.collection("users")
.where("name", "==", name)
.get();
return querySnapshot.docs.map((doc) => doc.data().deviceUid);
}
fire();