在以下代码片段中:
1 const GetErrors = async (projectScanID: number, projectName: string) => {
2 try {
3 console.log("fetching errors")
4 const errorsFetch = await fetchErrors(projectScanID);
5 console.log("errorsfetch:", errorsFetch)
6 await setErrors(errorsFetch);
7 console.log("errors", errors)
8 setIsErrorsFetchComplete(true);
9 console.log("errors: ", errors)
10 }
11 catch(e) {
12 enqueueSnackbar(`Could not load errors! Error: ${e}`, {variant: 'error'});
13 }
14}
我在第5行的console.log显示errorsFetch
未定义,尽管我在该行调用的fetchErrors函数中有Promise。console.log在第6行记录错误数据:
1 export const fetchErrors = async (project_scan_id: number): Promise<IError[]> => {
2 let errors = <Array<IError>>[];
3 let string_project_scan_id: string | null = String(project_scan_id)
4 ///fetches error data
5 return Promise.resolve(errors).then(function (value) {
6 console.log("value:", value)
7 }).catch(function (error) {
8 console.log("Error")
9 });
10 }
11}
请注意,我是如何在第一个代码片段中使用await
来等待fetchErrors
,然后再次等待setErrors
在第6行完成,然后在第8行使用setIsErrorsFetchComplete(true);
。为什么我用来从第一个代码片段的第5行的fetchErrors
中检索返回值的常量未定义?
编辑:errors
和isErrorsFetchComplete
是调用GetErrors
之前在更高范围内定义的状态。
此Promise
解析为一个值:
Promise.resolve(errors)
但是,你在这里链接到它:
.then(function (value) {
console.log("value:", value)
})
所以这个回调中的value
有你的errors
,但这并不能解决任何问题。它本质上是";燕子;解析的值。你也可以从这里返回:
.then(function (value) {
console.log("value:", value);
return value;
})
catch
回调也是如此。如果调用,则生成的Promise
链不会解析为任何内容,除非回调函数返回一些内容。
考虑到显示的代码,第二个问题对我来说没有多大意义。这里什么都不是";显示";任何东西这个术语暗示了React的使用,这里也没有显示。一旦Promise链接被解决,这可能完全值得一个单独的问题。