在React hook中,我定义了async函数。该函数调用另一个函数并等待结果。Await调用 Package 在try .. catch .. finally
块中。在某些情况下,由于某些原因,当代码执行到达await -时,它会停止。
代码看起来或多或少像这样:
const useCustomHook = () = {
const searchMutation = useSearchMutation();
const onSearch = async (searchParams: ISearchParams) => {
try {
// some code
const resposnse = await searchMutation({params});
// handling results
} catch (error) {
// some code
} finally {
// some code
}
}
return { onSearch };
}
SearchMutation
是使用react-query
Package 请求执行的另一个钩子:
const mutatePromise = async (variables: Variables, options?: IMutationOptions<Data, Error, Variables>) => {
return new Promise<Data>((resolve, reject) => {
result.mutate(variables, {
...options,
onSuccess: data => {
resolve(data);
},
onError: error => {
reject(error);
},
});
});
};
result.mutate
调用正在执行自定义突变函数:
const result = _useMutation<Data, Error, Variables>({
mutationKey: url,
mutationFn: async variables => {
const method = options?.method || "POST";
const response = await fetch(url, {
method,
headers: {
Accept: options?.accept || "application/json",
"Content-Type": "application/json",
},
body: variables ? JSON.stringify(variables) : undefined,
});
if (options?.accept === "text/csv") {
const filename = getFilenameFromHeaders(response.headers);
const blob = await response.blob();
downloadFile(blob, filename);
return;
} else {
const contentLength = Number(response.headers.get("Content-Length"));
if (contentLength > 0) {
const responseValue = await response.json();
if ((responseValue?.hasOwnProperty("isSuccess") && !responseValue.isSuccess) || !response.ok) {
throw responseValue;
}
return responseValue;
}
}
if (!response.ok) {
throw new Error();
}
},
...options,
});
在某些特定情况下(当在短时间内执行多个调用时),onSuccess
函数会用undefined
值解析。在这种情况下,onSearch
函数在等待searchMutation
函数调用后停止执行代码。
这怎么可能?用undefined解析promise并不应该阻止进一步的代码执行。而且不会抛出错误。它只是默默地停止…
你至少有任何提示如何调试这样的问题吗?
1条答案
按热度按时间pgpifvop1#
问题是由这部分代码引起的:
由于某种原因,我仍然不清楚,它没有调用
resolve
或reject
。用result.mutateAsync(variables, options)
替换它解决了这个问题。