next.js 为什么await在JavaScript中停止进一步的执行而不抛出错误?

oxosxuxt  于 2023-06-22  发布在  Java
关注(0)|答案(1)|浏览(137)

在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并不应该阻止进一步的代码执行。而且不会抛出错误。它只是默默地停止…
你至少有任何提示如何调试这样的问题吗?

pgpifvop

pgpifvop1#

问题是由这部分代码引起的:

return new Promise<Data>((resolve, reject) => {
    result.mutate(variables, {
        ...options,
        onSuccess: data => {
            resolve(data);
        },
        onError: error => {
            reject(error);
        },
    });
});

由于某种原因,我仍然不清楚,它没有调用resolvereject。用result.mutateAsync(variables, options)替换它解决了这个问题。

相关问题