Tenho uma função assíncrona que busca um objeto DB ( Referral
). Além da busca principal, várias outras partes do aplicativo também buscam auxiliares Referrals
por meio da mesma função exata e sua lógica.
Uma função async não pode retornar nada, então não pode ser usada como um retorno genérico. Em vez disso, temos que definir uma variável de estado com os resultados dela.
Se eu fizer
const [mainReferral, setMainReferral] = useState<Referral|null>(null);
// Fetch main referral
const fetchReferral = async (referralId:string) => {
const response = await get<any>("/referral/" + referralId);
// Lots of logic below, e.g.
response['specialDerivedField1'] = ...;
response['specialDerivedField2'] = ...;
//...
setMainReferral(response);
}
Isso só lida com o caso único da referência principal. Eu também posso ter
const [auxReferral1, setAuxReferral1] = useState<Referral|null>(null);
const [auxReferral2, setAuxReferral2] = useState<Referral|null>(null);
//...
Eu realmente tenho que adicionar parâmetros diferentes a essa função para decidir o que definir com um if-else
? Isso não parece muito robusto para mim.
const fetchReferral = async (referralId:string, case1:boolean, case2:boolean) => {
//...
if (case1)
setAuxReferral1(response);
else if (case2) {
setAuxReferral2(response);
else {
setMainReferral(response);
}
}
Alguma outra prática recomendada para isso? Ou talvez passar uma string para o nome da variável de estado e então encontrar o setter para ela pelo nome (não tenho certeza se o React suporta isso)?
Eu também adoraria isolar essa função utilitária em um arquivo utilitário separado que não lidasse com estado, mas como uma async
função isso seria impossível, eu acho?
Quem te disse isso te desinformou. Ou você pode ter entendido mal o que estava sendo comunicado.
Sua
async
função pode de fato retornar um resultado:E qualquer componente pode atualizar o estado com esse resultado:
Alternativamente, se você preferir encapsular o tratamento
Promise
na própria função, você pode passar o(s) setter(s) de estado como um retorno de chamada. Por exemplo:E qualquer componente fornecido passaria uma função como retorno de chamada:
Outra opção poderia ser encapsular a operação e o estado dentro de um hook personalizado. Por exemplo:
E qualquer componente fornecido simplesmente usaria esse gancho: