【发布时间】:2022-01-27 02:17:02
【问题描述】:
我正在编写一个钩子来发出返回两个属性 sessionId 和 sessionData 的发布请求。我在一个组件中使用这个钩子。我的钩子是这样的。
export const createOrder = async () => {
try {
const response = await postWithToken(API_ROUTES.PAYMENT_SESSION, token || '',
testObject)
console.log("FROM HOOK", response)
return response
} catch (err: any) {
console.log(err)
}
}
我的组件看起来像这样
const myComponent = () => {
useEffect(() => {
createOrder().then(data => {
console.log("Session Data",data.sessionData)
console.log("FROM PAGE", data)
})
}, [])
return (
<div />
)
}
当我尝试访问组件上的 data.sessionData 时,我收到 sessionDta 在类型 void 上不存在的错误。但是,如果我检查控制台上的日志,我会在组件和挂钩上得到相同的对象。此外,如果我检查我的组件类型数据,我会得到一个对象。
为什么会出现这个错误?
【问题讨论】:
-
您不会从
catch块中返回任何内容,因此您的函数的返回类型是WhateverTheTypeOfResponseIs | void,具体取决于发生的代码路径。您使用的是 Javascript 还是 Typescript?你是如何/从哪里得到这个错误的? VSCode 智能感知? -
是的,错误来自 Intellisense,我正在使用 Typescript。在我看来,
Promise<void>是 Typescript 编译器推断的默认类型。当我尝试键入异步函数的返回值时,我得到一个“类型WhateverTheTypeOfResponseIs在 ES5/ES3 中不是有效的async函数返回类型,因为它没有引用与 Promise 兼容的构造函数值”。我也没有降落在 catch 块上,因为当我从那里调用钩子createOrder时,我得到了组件上的对象。实际上,如果我检查组件上的类型,我也会得到一个对象 -
当您通过
.catch调用时,我建议您将错误处理逻辑移到useEffect挂钩中,例如createOrder().then(...).catch(...)。然后将您的createOrder函数 简化为简单的return postWithToken(...)。此外,createOrder不是hook- 它只是一个简单的函数。 -
另外,看起来您正在使用
TypeScript并且没有提供createOrder的返回类型,例如createOrder = async (): Promise<SomeType>,这就是它抱怨的原因。
标签: javascript typescript asynchronous hook