Попробуйте что-то вроде этого:
import { useState } from 'react';
function YourComponent({ properyIds }) {
const [isCodeValid, setIsCodeValid] = useState(false);
async function handleSignupClick() {
if (isCodeValid) {
return;
}
for (let i = 0; i < properyIds.length; i++) {
const companies = await firestore()
.collection(`properties`)
.doc(`${properyIds[i]}`)
.collection('companies')
.get();
for (const company of companies.docs) {
if (_.trim(company.data().registrationCode) === _.trim(registrationCode.toUpperCase())) {
setIsCodeValid(true);
return;
}
}
}
}
return (<button onClick={handleSignupClick}>Sign Up</button>);
}
Если вы дождетесь этих проверок, это позволит вам последовательно выполнить l oop и выйти из него простым return
, чего вы не можете сделать внутри обратного вызова. Обратите внимание: если это выполняет запросы к базе данных, вам, вероятно, следует показать ожидающую обратную связь, пока это происходит, чтобы пользователь знал, что щелчок что-то сделал.
Обновить :
Вы может захотеть провести все эти проверки параллельно, если это возможно, чтобы пользователю не пришлось ждать. Зависит от вашей ситуации. Вот как бы вы это сделали.
async function handleSignupClick() {
if (isCodeValid) {
return;
}
const allCompanies = await Promise.all(
properyIds.map(id => firestore()
.collection(`properties`)
.doc(`${properyIds[i]}`)
.collection('companies')
.get()
)
);
setIsCodeValid(
allCompanies.some(companiesSnapshot =>
companiesSnapshot.docs.some(company =>
_.trim(company.data().registrationCode) === _.trim(registrationCode.toUpperCase())
)
)
);
}