定义Promise内部的值时,为什么Promise的返回值未定义



在以下代码片段中:

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中检索返回值的常量未定义?

编辑:errorsisErrorsFetchComplete是调用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链接被解决,这可能完全值得一个单独的问题。

最新更新