I want to get the result of an async function - depending on the result I either want to execute another function or continue the for loop. Here is my Cloud Function:
return query.get().then(geoSnapshot => {
// If GeoquerySnapshot returns 0 docs, createDoc()
let docs = geoSnapshot.docs;
if (docs.length === 0) return createDoc(data);
for(let [index, doc] of docs.entries()){
// If age preferences are valid, joinDoc
let currentDoc = docs[index].data();
if (validAge(currentDoc, data)){
let matchedBefore = await(matchedBefore(currentDoc, data))
if (!matchedBefore){
return joinDoc(docs[index], data);
} else if (index === (docs.length - 1)) {
return createDoc(data);
}
}
return
}
}).catch( error => {
console.log("error query: " + error);
return { error: error };
})
async function matchedBefore(currentDoc, data){
return db.collection('users').doc(data.uid).get().then( doc => {
if ( !doc.exists ) return false;
// If user1 in matchedUsers
let matchedUsers = doc.get('matchedUsers');
if (matchedUsers === undefined) return true
let matchedBefore = matchedUsers.includes(currentDoc.user1);
console.log('matchedBefore: ' + matchedBefore);
if (matchedBefore) {
return false
} else {
return true
}
})
}
I'm getting this following error on let matchedBefore = await(matchedBefore(currentDoc, data))
:
Each then() should return a value or throw
How can I ensure the function matchedBefore()
finishes before the for loop continues?
I think you are too confused with the implementation of async-await. The correct way would be:
return query.get().then(async geoSnapshot => { // If GeoquerySnapshot returns 0 docs, createDoc() let docs = geoSnapshot.docs; if (docs.length === 0) return createDoc(data); /* eslint-disable no-await-in-loop */ for(let [index, doc] of docs.entries()) { // If age preferences are valid, joinDoc let currentDoc = docs[index].data(); if (validAge(currentDoc, data)){ let matchedBefore = await(matchedBefore(currentDoc, data)) if (!matchedBefore){ return joinDoc(docs[index], data); } else if (index === (docs.length - 1)) { return createDoc(data); } } return } /* eslint-enable no-await-in-loop */ }).catch( error => { console.log("error query: " + error); return { error: error }; }) async function matchedBefore(currentDoc, data){ let doc = await db.collection('users').doc(data.uid).get() if ( !doc.exists ) return false; // If user1 in matchedUsers let matchedUsers = doc.get('matchedUsers'); if (matchedUsers === undefined) return true let matchedBefore = matchedUsers.includes(currentDoc.user1); console.log('matchedBefore: ' + matchedBefore); return !matchedBefore }
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.